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

タイトル 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 な例で挙げた『ファイルのパス』が化ける話とは無関係です。

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

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