投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/1/21 19:12:07
> ちょっと事情があり、取得したいのです、それも英語圏としての文字で
その事情をお聞かせ願えませんか?
画面表示が目的なのか、通信電文やファイル出力などに使うのが
目的なのかによって、行うべき対処方法も変わってきてしまいますので。

まず、それは「文字」で無ければならないのでしょうか。
電文系/ファイル出力系であるならば、そもそも String を使うべきでは無く、
Byte() など、生のバイナリで扱うべき領域であるかと思います。

どうしても String しか使えない事情があるのだとしたら、
ChrW 連結で構築するか、StrConv を使うなどせねばならないでしょう。


> StrConvでロケールIDを変更すれば出来るのかと思いましたが、出来ませんでした。
Byte() → String 変換の意味だとすれば、StrConv で良いと思いますよ。
この場合、vbUnicode を指定すれば、CStr の代用となります。

この手の処理を行う際、LocaleID を使用できない文字列関数/ステートメント
(例えば、CStr/Str/Chr/Mid/Left/Right/MsgBox 等)および ANSI 系 API や
標準コントロール(TextBox, Label 等) は一切使用不可能と思ってください。

バイト系関数(LeftB/MidB/RightB 等)や Wide 系 API、それと
Unicode 対応な ActiveX コントロールなどが限定的に使用可能です。

また OS の違い、特に 9x系列 と NT系列では異なる結果になりえる事も覚悟して置いてください。


> 英語圏ではEBCDICのようなので
VB6 が使うのは、「既定の ANSI コードページ」です。

日本語(LCID=1041)
 既定のANSIコードページ = 932
 既定のEBCDICコードページ = 20290

米語(LCID=1033)
 既定のANSIコードページ = 1252
 既定のEBCDICコードページ = 37


> 上記のように、例えば130の値をStringの文字列にしたときに、英語圏と同じように
> (26,32)、131なら(146,1)としたいのです。
(26,32) というのは、Unicode の U+201A [Single Low-9 Quatation Mark]、
(146,1) というのは、Unicode の U+0192 [Latin Small Letter F With Hook] ですね。

> 以下に、試したソースを貼り付けます。
当方環境では、StrConv で変換できています。
Dim b1() As Byte, b2() As Byte
ReDim b1(0), b2(0)
b1(0) = 130: b2(0) = 130

Dim s1 As String, s2 As String
s1 = StrConv(b1, vbUnicode, 1041)
s2 = StrConv(b1, vbUnicode, 1033)

Debug.Print Hex(AscW(s1))    '「0」     U+0000 'NULL'  
Debug.Print Hex(AscW(s2))    '「201A」  U+201A 'Single Low-9 Quatation Mark' 
ファイル出力が目的なら、Byte() を Put# する事で対応してください。