タイトル : Re^3: ファイルパスの機種依存文字を取得する方法について 投稿日 : 2014/11/28(Fri) 16:31 投稿者 : 魔界の仮面弁士
> 自分が取得したい機種依存文字のことだったでょうか? VB5 では String 型の内部データは Unicode ベースで管理されていますが、 その読み書き(テキストボックス、Open ステートメント、MsgBox 関数などなど)は、 すべて「既定のコードページ」で行われます。日本語版なら Shift_JIS 相当ですね。 (なお、日本語版以外の環境では、Shift_JIS とは異なるコードページが使われます) そのため VB5 では、『Shift_JIS で扱えない文字は、すべて化ける』ことになります。 たとえば、 Call MsgBox( ChrW(&H4F60) & ChrW(&H597D) ) というコードは、 VB5 や VBA では「?好」 VB.NET や VBScript では、(漢字2文字の)ニイハオ と表示されます。 また、『Shift_JIS では区別されるが、Unicode では同じ文字として扱われる文字は区別できない』仕様です。 たとえば、Shift_JIS では平方根記号が Chr(&H8795) と Chr(&H81E3) の二箇所にマップされていますが、 VB5 は Unicode で管理される都合上、いずれも ChrW(&H221A) となってしまい、両者を区別できません。 ReDim sjis1(1) As Byte ReDim sjis2(1) As Byte sjis1(1) = &H95: sjis1(0) = &H87 sjis2(1) = &HE3: sjis2(0) = &H81 Dim s1 As String, s2 As String s1 = StrConv(sjis1, vbUnicode, &H411) s2 = StrConv(sjis2, vbUnicode, &H411) Debug.Print s1 = s2 's1 と s2 は同じ文字になってしまう > パスに機種依存文字が含まれる画像ファイルを表示できます。 ファイル名も同様です。 VB5 の標準機能、たとえば Open ステートメントでは、 ファイル名に Shift_JIS 相当の文字しか使えませんが、 ADO などでは、Unicode のファイル名も扱えます。 Const adSaveCreateOverWrite = 2 Dim filePath1 As String, filePath2 As String Dim stm As Object '漢字2文字「ニイハオ」を含むファイル名。ニイの文字は非日本語な漢字。 filePath1 = Environ("TEMP") & "\NIHAO1(" & ChrW(&H4F60) & ChrW(&H597D) & ").TXT" filePath2 = Environ("TEMP") & "\NIHAO2(" & ChrW(&H4F60) & ChrW(&H597D) & ").TXT" 'ADODB.Stream は、Unicode パスをサポートしている Set stm = CreateObject("ADODB.Stream") stm.Open stm.WriteText "Ni-Hao" stm.SaveToFile filePath1, adSaveCreateOverWrite stm.Close 'Open ステートメントは、Unicode パスをサポートしていない Dim fno As Integer fno = FreeFile() Open filePath2 For Output As #fno '★エラーになる Print #fno, "Ni-Hao"; Close #fno > Windowsフォトギャラリー(使用OSがVista)では、パスに機種依存文字が > 含まれる画像ファイルを表示できます。どの様にパスを取得しているか > 不明です。 Unicode ベースのアプリケーションかどうかが鍵となります。 たとえば、そのアプリが Wide バージョンの CreateFile API を呼び出しているのなら、 「ニイハオ」というファイル名も開けますが、ANSI バージョンの CreateFile API なら、 「ニイハオ」というファイル名は開けず、「?好」などと化けて処理されてしまうでしょう。 VB5 であれば、comdlg32.ocx のコモンダイアログを使うのではなく、 comdlg32.dll の GetOpenFileNameW でファイル名を指定させるようにすれば、 上記「ニイハオ」なパスなども受け取れるようにはなります。 ただし、そのファイル名を MsgBox や Debug.Print で表示させたり、 Open ステートメント等で読み書きするといったことはできませんので、 それぞれ、Unicode 対応バージョンの仕組みに置き換える手間は発生します。 Unicode 文字列の読み書きが発生するのであれば、VB.NET に乗り換えた方が良いですよ。 |