HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0907
(´@`)中国語のファイル名やフォルダ名を正常に取得する17未解決


(´@`)

リンク

2009/9/7(Mon) 18:36:44|NO.27579

中国語で書かれたフォルダ名やファイル名を取得すると、
中国語の部分が"?"と正常に表示されません。
どのようにすれば、正常に取得できるのでしょうか。



この記事に返信する


tsuka

リンク

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

なたでさん、回答ありがとうございます。
しかし、なたでさんの方法で試してみましたが、正常に表示する事が出来ませんでした。
他に幸せになる方法はございませんか。



shinkun

リンク

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

もう少しで幸せになれそうですので、何方か手を差し伸べていただけないでしょうか。



ANTARES

リンク

2009/9/15(Tue) 06:29:45|NO.27694

 そのテキストファイルがないと確認のしようがないので……



(´@`)

リンク

2009/9/15(Tue) 11:15:54|NO.27697

ANTARESさん、回答ありがとうございます。
テキストファイルを以下にアップロードしました。

http://www1.axfc.net/uploader/File/so/30853.zip&key=test



ANTARES

リンク

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してみたのですが、正常に表示されません。
これはやはり、中国語だからでしょうか。



shinkun

リンク

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さん、回答ありがとうございます。
その通り、私が願っているのは、ファイル/フォルダ名の取得にあります。
私は、他のファイラー(国産)を使っているのですが、そこでは文字化けはしておりません。



osakana

リンク

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の場合でも、中国語の箇所が"?"と表示されてしまいました。



osakana

リンク

2009/9/17(Thu) 11:07:43|NO.27735

> > 例えば次のようにすれば、変換不可能な文字は無理ですが、
> > それ以外の文字であればむちゃくちゃな変換にならずに表示出来ます。
> ただし、後者の方は、memcpyの場合でも、dupptrの場合でも、
> 中国語の箇所が"?"と表示されてしまいました

ある言語固有のキャラクタは変換不可で?になりますが、
それ以外の変換可能な文字であれば表示できます。
と言う意味で言ったつもりだったのですが、完全に分かり辛かったですね。
正常に表示されないと言うのは、
BOM付きのUnicode文字列を 先頭ごと変換に掛けてしまって、
めちゃくちゃになってしまったのかと勝手に解釈していたんですが
そうではなかったようですね早とちりすみません。



ひで

リンク

2009/12/28(Mon) 18:22:48|NO.29575

スレッド違いすみません。
osakanaさん、以前下記スレッドで回答いただいて、思っていたことが実現できました。
http://hsp.tv/play/pforum.php?mode=pastwch&num=23981
お礼をしていなかったため、あらためてありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.