投稿者 やんやん  (その他) 投稿日時 2009/1/21 09:42:45
やんやんと申します。
唐突で申し訳ないのですが…
#説明するのが下手なのですが、がんばって見ます。

環境:
 OS:Windows XP pro SP3
 VB:VB6 SP5(今更VB6かとお思いかもしれませんが…)

VB6では、日本語環境で使うと、128~255の文字が取得できないようですが、
ちょっと事情があり、取得したいのです、それも英語圏としての文字で

何がしたいかというと、例えば、Chr(130)は日本語だと文字列にすると
Unicodeで(0,0)(2バイト)になりますが、
コンパネ→地域と言語のオプション→詳細設定→Unicode対応でないプログラムの言語
で、「英語(米国)」を選らび、英語圏として動作させると、Chr(130)の文字列は
Unicodeで(26,32)となります。
Chr(131)なら(146,1)です。

上記のように、例えば130の値をStringの文字列にしたときに、英語圏と同じように
(26,32)、131なら(146,1)としたいのです。

http://www.kanaya440.com/contents/script/vbs/others/lcid.html
でStrConvでロケールIDを変更すれば出来るのかと思いましたが、出来ませんでした。

http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200706/200706_07060057.html
を見ると、英語圏ではEBCDICのようなので、コードページ変換テーブルをみて
WideCharToMultiByte等を使用してみても出来ませんでした。
(該当しそうなEBCDICのコードページ変換テーブルの値は試してみました)

http://homepage2.nifty.com/nonnon/SoftSample/SampleModADOS.html
も見ましたが、ちょっと事情があり試せませんでした。

ヒントやポインタでもいいので、「ここを見ればいい」とか「こうすればいい」
とか教えていただけないでしょうか?

以下に、試したソースを貼り付けます。

どなたかご教授頂きたく思います。

以上宜しくお願い致します。

・試したソース
---
Private Declare Function WideCharToMultiByte Lib "kernel32" _
    (ByVal CodePage As Long, _
     ByVal dwFlags As Long, _
     ByVal lpWideCharStr As Long, _
     ByVal cchWideChar As Long, _
     ByRef lpMultiByteStr As Any, _
     ByVal cchMultiByte As Long, _
     ByVal lpDefaultChar As String, _
     ByVal lpUsedDefaultChar As Long) As Long
Private Declare Function MultiByteToWideChar Lib "kernel32" _
    (ByVal CodePage As Long, _
     ByVal dwFlags As Long, _
     ByRef lpMultiByteStr As Any, _
     ByVal cchMultiByte As Long, _
     ByVal lpWideCharStr As Long, _
     ByVal cchWideChar As Long) As Long

Private Sub Command1_Click()

Dim aaa() As Byte
Dim bbb() As Byte
Dim ccc(1) As Byte
Dim i As Integer
Dim tmpstr As String
Dim tmpstr2 As String
'Dim fileno As Integer
'
'fileno = FreeFile

'Open "C:\tmp\chren.txt" For Append As #fileno
'Print #fileno, Chr(130)
'Print #fileno, Chr(131)
'Close #fileno

'Open "C:\tmp\chrjp.txt" For Append As #fileno
'Print #fileno, Hex(130)
'Print #fileno, Hex(131)
'Close #fileno

'Debug.Print StrConv(CStr(Hex(130)), vbUnicode)

ccc(0) = &H1A
ccc(1) = &H20

Debug.Print Hex(130)

tmpstr = CStr(ccc)
Debug.Print tmpstr

bbb = StrConv(Hex(130), vbFromUnicode, 1033)
tmpstr = StrConv(Hex(130), vbFromUnicode, 1033)

Debug.Print ":" & tmpstr

For i = 0 To UBound(bbb)
    Debug.Print bbb(i) & " ";
Next
Debug.Print vbCrLf
'aaa = tmpstr

tmpstr = CStr(130)

Debug.Print "tmpstr=" & tmpstr

'aaa = WCMB_Encode(20127, tmpstr)
'aaa = WCMB_Encode(500, tmpstr)
aaa = tmpstr

For i = 0 To UBound(aaa)
    Debug.Print aaa(i); " " & Hex(aaa(i)) & " ";
Next

Debug.Print vbCrLf

'tmpstr = Chr(131)
'
'aaa = tmpstr

'aaa = WCMB_Encode(20127, "131")

tmpstr = "131"

aaa = tmpstr

For i = 0 To UBound(aaa)
    Debug.Print aaa(i); " "; ' & Hex(aaa(i)) & " ";
Next

Debug.Print vbCrLf


' 26  1A  32  20
'
' 146  92  1  1

' 63  3F

' 49   0   51   0   49   0


End Sub

'---共通関数
' 関数名    : WCMB_Encode
' 返り値    : 出力文字データ
' 引き数    : cp    : 出力文字データのコードページ番号
'           : strUni: UNICODE文字データ
' 機能説明  : UNICODE文字データを指定のコードに変換する
' 備考      : WideCharToMultiByteによる文字コード変換
Private Function WCMB_Encode(ByVal cp As Long, ByRef strUni As String) As Byte()
    On Error GoTo ErrHandler

    Dim lngUniLen As Long
    Dim lngBufLen As Long
    Dim lngRtn As Long
    Dim bytOut() As Byte

    lngUniLen = Len(strUni)
    If lngUniLen = 0 Then Exit Function
    lngBufLen = lngUniLen * 5
    ReDim bytOut(lngBufLen - 1)
    lngRtn = WideCharToMultiByte _
        (cp, 0, StrPtr(strUni), lngUniLen, bytOut(0), lngBufLen, vbNullString, 0)
    If lngRtn Then
        ReDim Preserve bytOut(lngRtn - 1)
        WCMB_Encode = bytOut
    End If
    
    Exit Function
ErrHandler:
    Debug.Print "文字コード変換エラー:" & Err.Description
End Function