タイトル : Re^3: ファイルパスの機種依存文字を取得する方法について 投稿日 : 2014/12/01(Mon) 17:24 投稿者 : 魔界の仮面弁士
> s1とs2で同じ変数を使用しているため、 ごめんなさい!! No.16031 のコードが大幅に間違っていました。あれじゃ意味が分からないですよね…。 No.16031 を修正しましたので、再度御確認願います。 同種の問題を抱えた文字の一覧として、下記の資料も参考にしてみてください。 http://support.microsoft.com/kb/170559/ja > > たとえば、Shift_JIS では平方根記号が Chr(&H8795) と Chr(&H81E3) の二箇所にマップされていますが、 > となっていたため、sjis1に格納されて&H8795となると思いました。 以下、修正した No.16031 をお読みいただいた上での話になりますが: sjis1 も sjis2 も、バイト型の一次元配列(2 Byte分)です。 その中身は「平方根記号を Shift_JIS にてエンコードした値」です。 一方、s1 と s2 は、可変長文字列型です。バイト型の一次元配列でも代用可能ですけれども。 その中身は「平方根記号を UTF-16(リトルエンディアン) にてエンコードした値」です。 ↓↓ 以下蛇足 ↓↓ ご存知かと思いますが、Shift_JIS バイナリから Unicode(UTF-16)バイナリへの変換には、 「StrConv 関数と vbUnicode 定数」が使われます。逆変換なら vbFromUnicode 定数ですね。 Label1.Caption = StrConv(sjisBinary, vbUnicode, &H411) 上記は、第一引数を Shift_JIS(CP932) 相当のバイナリとみなした上で、 それを Unicode バイナリへと変換せよ、という意味になります。 第 3 引数に指定した &H411 (1041) は、日本語版 Windows のロケールIDです。 http://msdn.microsoft.com/ja-jp/library/cc392381.aspx 日本語環境で動かす前提であれば、第3引数は省略可能です。 (第3引数を省略するかゼロを指定した場合、現在のカルチャが利用されます) Label1.Caption = StrConv(sjisBinary, vbUnicode) ちなみに、UTF-16 バイナリを String 型にする場合には、このように書きます。 Debug.Print StrConv(binUnicode, 0, &H411) Debug.Print StrConv(binUnicode, 0) Debug.Print CStr(binUnicode) Debug.Print binUnicode ↑↑ 蛇足ここまで ↑↑ > > ニイハオ.TXT な例で挙げた『ファイルのパス』が化ける話とは無関係です。 > ファイル名が機種依存文字の場合にファイル内の内容を読み込むために必要と > 思いました。読み込んだファイルの内容を変数に格納する方法を探します。 先述した『ADODB.Stream』を試してみてください。 これの LoadFromFile メソッドが Unicode パスに対応しています。 (LoadFromFile は、ファイルの内容をストリームにロードするためのメソッドです) http://msdn.microsoft.com/ja-jp/library/cc364272.aspx 『ADODB.Stream』は、Type プロパティで「バイナリデータ」モードと 「テキストデータモード」を切り替えられます。 テキストモードの場合: WriteText メソッドで、ストリームに文字列を書き込む。 ReadText メソッドで、ストリームから文字列を読み込む。 Charset プロパティで、読み書きに使う文字コードを指定。 LineSeparator プロパティで、読み書きに使う改行文字を指定。 バイナリモードの場合: Write メソッドで、ストリームにバイト配列を書き込む。 ReadText メソッドで、ストリームからバイト配列を読み込む。 > > (たとえば、No16033 の例に挙げた「ニイハオ」を渡すと False が返されます。 > No.16031ではないですか? 16031 ですね。済みません。 > コモンダイアログでファイルパスに機種依存文字が含まれる場合に > "?"が表示されます。"?"はファイル名やフォルダ名で使用できない 化けてしまった後の文字列で判定しても意味がありません。 化ける前の文字列で判定できるよう、処理を見直してみてください。 > 判定するプログラムは『ファイルのパス』が化ける事の回避で > 使用しますか? たとえば、 「ファイル名をデータベース等から入手しており、 それを用いて、Open ステートメントで保存したいが、 Unicode 文字が含まれていると保存に失敗してしまうので 事前検証のために使いたい」 といった使い方が出来ます。 この判定関数をどのように使うかは自由ですが、下記の点に注意してみて下さい。 (1) VB6 のすべての標準コントールおよび一部のActiveXコントロールは、 Unicode 文字列の読み書きに対応しておらず、「ニイハオ」などの文字を扱えません。 ※ TextBox、InputBox、MSComDlg 等々がこれにあたります。 (2) Unicode 対応の AcitveX コントロールとしては、 MSDataGrid や WebBrowser などが挙げられます。 http://yaplog.jp/orator/archive/15 http://yaplog.jp/orator/archive/80 (3) クリップボードは Unicode 文字列の入出力に対応していますが、 VB6 の Clipboard オブジェクトは、Unicode テキストに非対応です。もしも Unicode のまま読み書きしたい場合は、Get/SetClipboardData API などで対応します。 http://yaplog.jp/orator/archive/17 http://yaplog.jp/orator/archive/16 > ため、パスに"?"が含まれる場合は機種依存文字と判定できるのでは? > (For〜Next、Mid等で) "?" を検出したいだけなら、ループせずとも、 If strData LIKE "*[?]*" Then MsgBox "? が含まれています" End If とか If InStr(1, strData, "?", vbBinaryCompare) > 0 Then MsgBox "? が含まれています" End If などと書けますよ。 > comdlg32.dll の GetOpenFileNameW(関数?)のみで文字化けは回避できますか? はい、「ニイハオ」を含んだパスなどを、文字化けすることなく取得することが可能です。 そのパスを、(VB 標準のステートメントではなく) ADODB.Stream で読み書きすればよいでしょう。 なお、受け取ったパスを MsgBox とか ウォッチウィンドウ とか 各種コントロールなどに 受け渡した場合、Shift_JIS に無い文字は表示が化けてしまうことになります。 > GetOpenFileNameWについて調べてみます。 『Unicode対応版「ファイルを開く」ダイアログ』というコードを サンプル投稿掲示板に投稿しておきました。参考になれば。 http://www.hanatyan.sakura.ne.jp/patio/patio.cgi |