|
|
2009/9/7(Mon) 18:36:44|NO.27579
中国語で書かれたフォルダ名やファイル名を取得すると、
中国語の部分が"?"と正常に表示されません。
どのようにすれば、正常に取得できるのでしょうか。
|
|
2009/9/7(Mon) 21:53:51|NO.27580
「Unicode」なんかで過去ログを検索すると幸せになれるかもしれません
|
|
2009/9/9(Wed) 17:42:22|NO.27602
tsukaさん、回答ありがとうございます。
MultiByteToWideChar等を試してみたのですが、幸せになる事が出来ませんでした。
詳しくお願いできないでしょうか。
|
|
2009/9/9(Wed) 20:40:50|NO.27606
サンプルファイルを作ってみました。
8.3形式のファイル名がないファイルはHSP標準命令で扱うことが出来ません。
#include "comdlg32.as"
#include "kernel32.as"
#include "user32.as"
#include "gdi32.as"
#module "unicodetest"
#defcfunc ctype_GetOpenFileNameW int ptr
GetOpenFileNameW ptr
return stat
#defcfunc ctype_lstrlenW str text
lstrlenW text
return stat
//パスの一部にUnicodeが入るようなファイルを選択可能なダイアログの表示
#deffunc dialogW var tagOFN_lpstrFile,str extension,str description
tagOFN_maxpathsize=260*2
sdim tagOFN_lpstrFile,tagOFN_maxpathsize,1 ;パス
tagOFN_FilterA = description + "|*." + extension + "|全てのファイル(*.*)|*.*||"
sdim tagOFN_FilterW,ctype_lstrlenW(tagOFN_FilterA)*2
cnvstow tagOFN_FilterW,tagOFN_FilterA
sdim VerticalBarW,2
cnvstow VerticalBarW,"|"
repeat ctype_lstrlenW(tagOFN_FilterA)
if(wpeek(tagOFN_FilterW,cnt*2)==wpeek(VerticalBarW,0)) {
wpoke tagOFN_FilterW,cnt*2,0
}
loop
dim tagOFN,22 //OPENFILENAME構造体
tagOFN( 0)=76 //lStructSize
tagOFN( 1)=hwnd //hwndOwner
tagOFN( 2)=hInstance //hInstance
tagOFN( 3)=varptr(tagOFN_FilterW) //lpstrFilter
tagOFN( 7)=varptr(tagOFN_lpstrFile) //lpstrFile
tagOFN( 8)=260 //nMaxFile
tagOFN(13)=0x00000004|0x00000800|0x00080000 //Flags
mref outint,64
outint = ctype_GetOpenFileNameW(varptr(tagOFN))
return cnvwtos(tagOFN_lpstrFile)
//8.3形式のファイル名を取得する
#defcfunc getpath83W var textW,local text,local size
sdim text
GetShortPathNameW varptr(textW),varptr(text),0
size = stat*2
sdim text,size
GetShortPathNameW varptr(textW),varptr(text),size
return cnvwtos(text)
//Unicodeの文字を表示する
#deffunc mesW var text,local rect,local BMSCR
rect = ginfo(22),ginfo(23),ginfo(26),ginfo(27)
DrawTextW hdc,varptr(text),-1,varptr(rect),0
mref BMSCR,96+ginfo(3)
redraw (BMSCR(19)!=1)
GetTextExtentPoint32W hdc,varptr(text),ctype_lstrlenW(cnvwtos(text)),varptr(rect)
pos ginfo(22),ginfo(23)+rect(1)
return
#global
font "Arial Unicode MS",12
dialogW path,"txt","テキストファイル"
if(stat==0){stop}
mesw path
exist getpath83W(path)
mes "ファイルサイズ = " + strsize
size = (strsize>8)*8+(strsize<=8)*strsize
sdim nakami,size
bload getpath83W(path),nakami,size,0
mes "中身を少し表示"
mes nakami

| |
|
2009/9/10(Thu) 15:57:26|NO.27621
なたでさん、回答ありがとうございます。
しかし、なたでさんの方法で試してみましたが、正常に表示する事が出来ませんでした。
他に幸せになる方法はございませんか。
|
|
2009/9/10(Thu) 19:10:34|NO.27625
うーんと、その中国語の文字コードは何なのか分かりますか?
その文字コードが分からないで、むやみに Unicode と shift-jis の変換をやっても意味がないと思うのですが…。
その中国語の文字コード → Unicode へ変換すれば解決するんじゃないかなぁ。
|
|
2009/9/10(Thu) 19:13:09|NO.27626
shinkunさん、回答ありがとうございます。
恐らく、Big5かGB2312のどちらかと思われます。
|
|
2009/9/14(Mon) 17:00:40|NO.27685
過去ログにあったものを組み合わせて、"表示"はできたのですが、元がテキストファイル内の文字列な上、
希望しているのは、変数への代入なのです。
#uselib "user32.dll"
#func DrawTextExW "DrawTextExW" wptr,wptr,wptr,wptr,wptr,wptr
#define DT_TOP 0x00000000
#define DT_LEFT 0x00000000
#define DT_CENTER 0x00000001
#define DT_RIGHT 0x00000002
#define DT_VCENTER 0x00000004
#define DT_BOTTOM 0x00000008
#define DT_WORDBREAK 0x00000010
#define DT_SINGLELINE 0x00000020
#define DT_EXPANDTABS 0x00000040
#define DT_TABSTOP 0x00000080
#define DT_NOCLIP 0x00000100
#define DT_EXTERNALLEADING 0x00000200
#define DT_CALCRECT 0x00000400
#define DT_NOPREFIX 0x00000800
#define DT_INTERNAL 0x00001000
#define DT_EDITCONTROL 0x00002000
#define DT_PATH_ELLIPSIS 0x00004000
#define DT_END_ELLIPSIS 0x00008000
#define DT_MODIFYSTRING 0x00010000
#define DT_RTLREADING 0x00020000
#define DT_WORD_ELLIPSIS 0x00040000
file="C:\\test\\test.txt"//中身が中国語
exist file
sdim load,strsize
load=""
bload file,load,-1,0
repeat strsize/4
if cnt\100=0
text(cnt) = lpeek(load,cnt*4)
if cnt+1=strsize/4
loop
font msgothic,16
iti=0,0,300,300
DrawTextExW hdc,varptr(text),-1,varptr(iti),DT_WORDBREAK|DT_EXPANDTABS,NULL
redraw 1
もう少しで幸せになれそうですので、何方か手を差し伸べていただけないでしょうか。

| |
|
2009/9/15(Tue) 06:29:45|NO.27694
そのテキストファイルがないと確認のしようがないので……
|
|
2009/9/15(Tue) 11:15:54|NO.27697
|
|
2009/9/16(Wed) 11:34:55|NO.27709
テキストファイルは明らかにUTF-16で、UTF-16対応エディタ、IE6、
Firefox3で開いた場合と同じ表示になるので、日本語環境では
これ以上の改善は望めないと思います。
中国語はさっぱりなので、どこがおかしいのかわかりませんが、
何かがおかしいとすれば、テキストファイルの方が既におかしいのだと思います。
repeat〜loopの中はHSPの文法に沿っていず、何がしたいのかわかりませんが、
結果的に何もしないでloadをそのままDrawTexExW()したのと同じ結果に
なっていいます。もし、ビッグ・エンディアンをリトル・エンディアンに
変換しようとしているのなら、テキストファイルはリトル・エンディアンなので
必要ありません。
|
|
2009/9/16(Wed) 18:04:36|NO.27717
ANTARESさん、回答ありがとうございます。
確かにrepeat~loopを除いても動作しました。
テキスト内のコードがUTF-16とのことで、cnvwtosしてみたのですが、正常に表示されません。
これはやはり、中国語だからでしょうか。
|
|
2009/9/16(Wed) 21:16:38|NO.27725
> テキスト内のコードがUTF-16とのことで、cnvwtosしてみたのですが、正常に表示されません。
> これはやはり、中国語だからでしょうか。
その通りです。cnvwtos をすると Unicode (UTF-16) から shift-jis に変換されます。shift-jis は日本向けの文字コードなので、中国語のような複雑な漢字は取り扱えません。
中国語を扱うには、Unicode を利用するか、GB2312 や BIG5 などの中国圏の文字コードを利用する必要があります。
私も手を出してはいるのですが、なかなか難しいようですね…。
まだ希望に添える物を掴めていません。(p_;
ところで、(´@`) さんが希望しているのはファイル内データの取得・表示ではなく、ファイル/フォルダ名の取得・表示で良いんですよね?
そのファイルやフォルダはエクスプローラ上では文字化けを起こしているのでしょうか?
|
|
2009/9/16(Wed) 21:41:14|NO.27728
shinkunさん、回答ありがとうございます。
その通り、私が願っているのは、ファイル/フォルダ名の取得にあります。
私は、他のファイラー(国産)を使っているのですが、そこでは文字化けはしておりません。
|
|
2009/9/17(Thu) 09:31:49|NO.27732
私もあまり詳しくは無いのですが、
調べながらやっている内に何とか形になったようです。
実は細かい所とかそれほど分かってなかったりしますが・・・。
一応(´@`)さんのアップされたテキストファイルを、
中身と同じ文字列でリネームした物を使って確認しました(ファイル名と内容が同じ)。
あと当たり前ですがユニコード専用ですので普通のファイルは正しく開けません。
#include "comdlg32.as"
#include "user32.as"
#include "kernel32.as"
#define MAX_PATH $00000104
#define OFN_FILEMUSTEXIST $00001000
#define OPENFILENAME_SIZE_VERSION_400 $0000004C
#define DT_WORDBREAK $00000010
#define DT_EXPANDTABS $00000040
#define GENERIC_READ $80000000
#define OPEN_EXISTING $00000003
#define FILE_ATTRIBUTE_NORMAL $00000080
#define FILE_SHARE_READ $00000001
// OPENFILENAME構造体初期化に必要なものを準備
sdim type, 128
cnvstow type, "text(*.txt)\0*.txt\0All files(*.*)\0*.*\0\0"
wpoke type, 22 :wpoke type, 34 :wpoke type, 64 :lpoke type, 72
sdim path, MAX_PATH ;ここにファイルのパスが入る
sdim name, MAX_PATH ;ここにファイルネームが入る
cnvstow caption, "test"
cnvstow deftype, "txt"
// OPENFILENAME構造体初期化
dim ofn, 22
ofn(0) = OPENFILENAME_SIZE_VERSION_400
ofn(1) = hwnd
ofn(3) = varptr(type)
ofn(7) = varptr(path), MAX_PATH
ofn(9) = varptr(name), MAX_PATH
ofn(12) = varptr(caption)
ofn(13) = OFN_FILEMUSTEXIST
ofn(15) = varptr(deftype)
// ファイルオープンダイアログ
GetOpenFileNameW varptr(ofn)
if stat = 0 :mes "ダイアログキャンセル" :stop
// 取得したファイルネームからファイルを開きハンドルを得る
CreateFileW varptr(name), GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0
hfile = stat
if hfile = -1 :mes "CreateFileWでエラー" :stop
// ファイルのハンドルからファイルサイズ取得
GetFileSizeEx hfile, varptr(fsize)
// ファイルの内容を取得
sdim text, fsize + 1
ReadFile hfile, varptr(text), fsize, varptr(size), 0
// ハンドルを閉じる
CloseHandle hfile
// 表示
font msgothic, 16
mes "ファイルパス:"
rect = 0, GINFO_CY, 640, GINFO_CY + 16 : pos , rect(3)
DrawTextW hdc, varptr(path), -1, varptr(rect), DT_WORDBREAK|DT_EXPANDTABS
mes "\nファイルネーム:"
rect = 0, GINFO_CY, 640, GINFO_CY + 16 : pos , rect(3)
DrawTextW hdc, varptr(name), -1, varptr(rect), DT_WORDBREAK|DT_EXPANDTABS
mes "\nファイルの内容:"
rect = 0, GINFO_CY, 640, GINFO_CY + 16 : pos , rect(3)
DrawTextW hdc, varptr(text), -1, varptr(rect), DT_WORDBREAK|DT_EXPANDTABS
mes "\nファイルサイズ:\n" + fsize + "byte"
redraw
フォルダの取得など不十分な事がまだ沢山有りそうですが、
今の自分にはこれが限界ぽいです。(後は任せた・・・バタンキュ(_ _;;))
> テキスト内のコードがUTF-16とのことで、cnvwtosしてみたのですが、正常に表示されません。
> これはやはり、中国語だからでしょうか。
問題はBOMを考慮していないせいではないかと思われます。
例えば次のようにすれば、変換不可能な文字は無理ですが、
それ以外の文字であればむちゃくちゃな変換にならずに表示出来ます。
file="C:\\test\\test.txt"//中身が中国語
exist file
if strsize = -1 :end
sdim load,strsize
bload file,load
font msgothic,16
mes strf("%x", wpeek(load))
sdim text, 260
memcpy text, load, strsize - 2, 0, 2 ;dupptrでも良いかも
mes cnvwtos(text)

| |
|
2009/9/17(Thu) 09:56:56|NO.27733
osakanaさん、回答ありがとうございます。
前者のスクリプトの動作を確認いたしました。
ただし、後者の方は、memcpyの場合でも、dupptrの場合でも、中国語の箇所が"?"と表示されてしまいました。
|
|
2009/9/17(Thu) 11:07:43|NO.27735
> > 例えば次のようにすれば、変換不可能な文字は無理ですが、
> > それ以外の文字であればむちゃくちゃな変換にならずに表示出来ます。
> ただし、後者の方は、memcpyの場合でも、dupptrの場合でも、
> 中国語の箇所が"?"と表示されてしまいました
ある言語固有のキャラクタは変換不可で?になりますが、
それ以外の変換可能な文字であれば表示できます。
と言う意味で言ったつもりだったのですが、完全に分かり辛かったですね。
正常に表示されないと言うのは、
BOM付きのUnicode文字列を 先頭ごと変換に掛けてしまって、
めちゃくちゃになってしまったのかと勝手に解釈していたんですが
そうではなかったようですね早とちりすみません。
|
|