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

タイトル Re^5: ファイルパスの機種依存文字を取得する方法について
投稿日: 2014/12/02(Tue) 19:29
投稿者魔界の仮面弁士
> > 第 3 引数に指定した &H411 (1041) は、日本語版 Windows のロケールIDです。
> Visual Basic Learning Edition Version 5.0 では第 3 引数は無いようです。

そういえば VB5 でしたね。第三引数は VB6 からの機能です、済みません。


> http://www.k-sugi.sakura.ne.jp/windows/vb/3650/
> 上記ページの"Charset"プロパティを"Shift_JIS"に変更したら
> 機種依存文字が含まれてない場合は正しく読み込みました。

(α) ファイル名やフォルダ名に、Shift_JIS に無い文字が使われているか否か。

(β) テキストファイルの中身が、Shift_JIS なのか UTF-8 なのか UTF-16 なのか。

いったんココで、上記の 2 つの違いを明確にしておきましょう。



「"Charset"プロパティを"Shift_JIS"に変更」という話は、(β) のことを示しています。

しかし元々、今回の質問は題名にもあるように
  『ファイルパスの機種依存文字を取得する方法について』
を話題にしていたはずです。先に解決すべき問題は (α) の方ですよね。

そしてこの問題については、
 ・ファイル名の指定には、 comdlg32.ocx ではなく、GetOpenFileNameW API を使う。
 ・ファイルの読み書きには、ADODB.Stream オブジェクトを使う。
という回避策を提示しており、実際のソースコードも提示しています。


また、ここでいう「ファイルパスの機種依存文字」とは、(α) における
「Shift_JIS で表現できない文字」を示していると思ってください。

具体例を挙げれば、「立方メートル記号」や「'ニイハオ'の1文字目」を含むパスのことです。

インターネットで『機種依存文字』について調べてみると、先の「平方根記号」問題ですとか、
「半角カナ」、「丸囲み漢字」、「〜」の文字などを機種依存文字に含めることが多いのですが、
今回話題にしている (α) においては、これら半角カナや丸囲み漢字などは問題視されませんので
調査する際には、それらを混同しないようご注意ください。



> > 2) Unicode 対応の AcitveX コントロールとしては、

この場合、(β)の方の問題も関わってきます。
コモンダイアログコントロールなら、(α) と (β)の両方が影響しますね。


VB5 は、言語仕様的には Unicode 対応となっていますが、開発環境はそうではありません。
表示・入力する際には、常に Shift_JIS 相当の文字列しか扱えないのでご注意下さい。

Unicode 対応 API を呼び出したり、Unicode 対応 ActiveX コントロールを
利用するのであれば、Shift_JIS に無い文字を VB5 で扱うことが出来ますが、
VB5 の開発環境は、ソースコード中に Unicode 文字を直接記載することはできませんし、
標準で付属するコントロールの中にも、Unicode 対応のものはありません。
付属コントロールの少ない Learning Edition であるなら尚のこと。ここが今回の難点といえます。

(VB.NET であれば、開発環境も含め、Unicode にきちんと対応しているのですけれどね)


そして、VB5 などで Unicode 対応コントロールが必要な場合には、
 ・Microsoft Office 付属の FM20.DLL のコントロール群(Microsoft は非推奨としている)
 ・サードパーティ製の Unicode 対応コントロールを購入
などという対処方法を採ることになります。

ただ、VB5 向けのコントロールが、今でも入手可能かどうかは分かりません。
VB6 用は見つかりましたが…流石に開発ツールとしては古すぎますね。
http://www.cyberactivex.com/UnicodeTutorialVb.htm


> 変数のように使用するためのもの?

そのあたりは、ちょっと認識が違うかも知れません。

32bit 版の Visual Basic の文字列型は、常に Unicode で管理される仕様なので、
特に難しいことをせずとも、As String な変数さえ用意しておけば、その中に
任意の文字を格納させることができます。この段階で文字化け等が発生することはありません。

たとえば、ニイハオの最初の『イ尓』っぽい字とか、立方メートル記号の『m3』っぽい字でも
問題なく保持できますし、それを Left 関数や Mid 関数などで切り出すこともできます。


問題となるのは、「その文字列をどのように表示するのか、入力させるのか」です。
言語仕様としては取り扱えても、表示や入力などは別の問題であり、たとえば

・MsgBox 関数では表示できないので、MessageBoxW API で表示する。
・ファイル名の指定時なら、コモンダイアログコントロールでは扱えないので、
 コモンダイアログ API を使う。
・ファイルのパスであるのなら、Open ステートメントでは開けないので、
 Stream オブジェクトを使う。

などといった、それぞれ個別の対処が必要になるということです。


> これがあれば、コントロールのプロパティを取得して
先述したように、VB5 のコントロールは Unicode 文字を扱えません。
別途、Unicode 対応コントロールを用意する必要があります。


> 『ADODB.Stream』で読み書き可能?
はい。Stream オブジェクトの LoadFromFile メソッドやSaveToFile メソッドは、
Unicode 文字を含んだパスであっても、問題なく取り扱えます。

また、Stream オブジェクトには、バイナリであれテキストであれ、
任意のデータを書き込んだり、あるいは取り出したり出来ます。
今回は使いませんが、文字コードの自動判定機能などもあります。


> コモンダイアログのFilenameプロパティを格納しても文字化けしない?
先述したように、標準のコモンダイアログコントロールは、Unicode 文字を
扱えないため、コモンダイアログ API に置き換える必要があります。
具体的なサンプルコードは、既にお見せしましたよね。


> プログラムランチャーや、ファイルのパスの文字数を確認するプログラムで
> ラベルにパスを表示させています。
Label は使えません。
Label は標準コントロール(≠ActiveX コントロール)であり、Unicode 非対応です。
TextOutW API を用いて「描画」することで回避してみて下さい。


> VB2005がありますが、VB5.0でやりたいです。
VB5 って、17年前の代物ですよ? (VB2005 でも古すぎるぐらい…)

標準でサポートしていないことを、API などを使って回避していくわけですから、
実現するためには、上級者レベルの知識と経験が必要になることは覚悟しておいてください。



> http://yaplog.jp/orator/archive/15
> http://yaplog.jp/orator/archive/80
> 上記ページよりダウンロードしたデータは、VB5.0ではエラーで
> 開けませんでした。

MSDATGRD.OCX は、VB5 Learning Edition には付属していません。

WebBrowser コントロールなら使えますが、VB5 は IE3 時代の言語なので、
扱えるのはせいぜい IE4.01 まででしょうね。(IE5 以降の動作が保証されていない)


> 『ADODB.Stream』で画像ファイルは読み込めますか?
Stream で対応できるのは、画像のバイナリデータを読み取るところまでですね。
バイナリフォーマットを解析できるなら、PSet ステートメント併用で
無理やり表示することもできますが、現実的では無いでしょうね。

ファイルパスに、Unicode 文字を含む画像ファイルを表示するのであれば、
案としてはこんなところかな。

 (案1) FileSystemObject などを用いて、Unicode 名な画像ファイルを、
  別のファイル名(C:\TEMP\123.BMP など)にコピーし、その後で
  改めて LoadPicture 関数で表示する。

 (案2) 画像のバイナリから、Picture オブジェクトを生成する。
  http://yaplog.jp/orator/archive/19

 (案3) GDI+ Flat APIを使って描画する。
 http://msdn.microsoft.com/en-us/library/windows/desktop/ms533969.aspx

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

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