タイトル : Re^5: ファイルパスの機種依存文字を取得する方法について 投稿日 : 2014/11/28(Fri) 19:14 投稿者 : 魔界の仮面弁士
> 配列変数を再宣言して配列変数に文字コードを格納。 ここでいう「文字コード」とは、具体的には何を指定していますか? 先の回答の平方根記号の例などもありますので、どのように得た値なのかも重要です。 > sjis1はどこで宣言しているのか? ここです。 > > ReDim sjis1(1) As Byte > > sjis1(1) = &H95: sjis1(0) = &H87 宣言としては「Dim sjis() As Byte」相当ですが、このコードでは 配列確保のための ReDim ステートメントのみで済ませています。 > s1とs2は同じコードなので同じ結果になることが分かる。 提示のコードでは、バイナリデータを StrConv で文字列化する際の vbUnicode 変換について示したものですが、VB の文字列処理では、 こうした vbUnicode / vbFromUnicode 変換が各所で行われていたりします。 ファイル操作然り、Left/Mid/Right 等の文字列操作然り。 たとえば、『√記号』という 3 文字が書かれた、 Shift_JIS のファイルを、メモ帳等で作っておくとします。 それをバイナリエディタを使って開いた場合、恐らくは 81,E3,8B,4C,8D,86 と表示されることでしょう。(※1) そのファイルをもう一つ用意し、一方のファイルの先頭 2 バイトを バイナリエディタで書き換え、95,87,8B,4C,8D,86 という内容に変更して、 そのまま上書き保存します。(※2) 先ほどとは異なるバイナリで保存されていますが、Shift_JIS (コードページ932)の テキストファイルとしてみた場合、いずれも『√記号』という 3 文字を意味します。 さて、この 2 つのファイルの内容を、VB5 で String 変数に読み込んだ場合、 Shift_JIS から Unicode (UTF-16リトルエンディアン)への変換が発生し、 いずれの内容も 1A,22,18,8A,F7,53 なバイナリの文字列となります。(※3) 扱うバイナリが異なるだけで、※1〜3 はいずれも『√記号』という文字列を 表していることには変わりません。ただし、※3 から ※2 の文字への復元が 行えなくなったという意味では、これも一種の「文字化け」です。 そのため、この 81,E3 な文字も、「機種依存文字」の一種とみなされます。 (この手の機種依存文字は、『NECのIBM拡張文字』などと呼ばれることがあります) > サンプルコードを実行したところ、ADODB.Streamでテキストファイルが > 作成できました。 同様に、FileSystemObject なども、Unicode ファイル名に対応しています。 ファイルパスについては、こうした Shift_JIS / Unicode の問題だけでなく、 名前付きストリームパスへの対応状況の差異もあります。 (0) あらかじめ、C:\TEMP\ というフォルダーを用意しておく。 (1) メモ帳で「あいうえお」と記述し、[ファイル]-[名前を付けて保存]を開き、 文字コード ANSI とした上で、ファイル名の欄に「"C:\TEMP\TEST.TXT"」と ダブルクォーテーションも含めてフルパスで指定し、保存して閉じる。 (2) [Win]+[R] キーで『ファイル名を指定して実行』画面を表示し、そこに 「NOTEPAD "C:\TEMP\TEST.TXT:Stream1"」と記述して OK を押す。 メモ帳が起動し、ファイルの新規作成の確認が行われるので[はい]と答え、 「かきくけこ」の 5 文字を入力して [ファイル]-[上書き保存] して閉じる。 (3) 再度、[Win]+[R] キーで『ファイル名を指定して実行』画面を表示し、 「NOTEPAD "C:\TEMP\TEST.TXT:Stream1"」と記述して OK を押す。 メモ帳にて「かきくけこ」が表示されるかを確認する。 上記の状況において、VB5 から「かきくけこ」と書かれたファイル内容を読み取る場合、 VB 標準の Open ステートメントでは対応できません。たとえば、 Open "C:\TEMP\TEST.TXT:Stream1" For Input As #1 などと記述してみても、実行時エラーになってしまうことでしょう。 蛇足ですが、この名前付きストリーム(代替データストリーム)は、 ブラウザ等からダウンロードしたファイルに対して、 「このファイルは、インターネット上の場所から取得されており、安全でない可能性があります。」 などと表示させるためにも使われています。 たとえば、「NOTEPAD "C:\TEMP\sample.gif:Zone.Identifier"」などのように、 ファイル名の末尾に、"Zone.Identifier" というストリーム名をコロンで繋いで 『ファイル名を指定して実行』から開くと、その内容を読み取ることが出来ます。 (コマンドプロンプトなら、DIR コマンドの /R オプションでストリームを列挙できます) > ADODB.Stream で検索したところ、以下のページを見つけました。 > http://www.k-sugi.sakura.ne.jp/windows/vb/3650/ 確かに、文字コードに関して記載されていますが、そこに書かれている内容は、 『テキストファイルの内容』を読み取る際に、どの文字コードでデコードするかを 紹介したものです。ニイハオ.TXT な例で挙げた『ファイルのパス』が化ける話とは無関係です。 |