tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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 に乗り換えた方が良いですよ。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。