掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
16進(UNICODE)からSJISへの変換 (ID:89276)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> 実際の変換はどの処理で行なわれているのでしょうか? そもそも、VB6の内部文字コードは UTF-16 ですので、 変換は不要ですよ。 Dim a() As Byte ReDim a(3) a(0) = &HE5 a(1) = &H65 a(2) = &HD8 a(3) = &H4E MsgBox a 'Unicodeバイト配列をそのまま渡す。 MsgBox CStr(a) '明示的にString型に変換して渡す。 MsgBox StrConv(a, 0, 1041) '第2引数にフラグ無し 逆変換も、 Dim c() As Byte c = "日付" Debug.Print Hex(c(0)), Hex(c(1)), Hex(c(2)), Hex(c(3)) とするだけですし。 個別に変換したいなら、 Debug.Print Hex(Asc("日")) Debug.Print Hex(AscW("日")) とか Debug.Print Chr(&H93FA) Debug.Print ChrW(&H65E5) となりますね。 > 早速テストしてみましたが、"?"が返ってきてしまいます。 > bbb = StrConv(a, vbFromUnicode) この結果にあるbbbは、(日本語環境では)Shift_JIS/Windows31J形式の 文字列になっています。変換自体は正しく行われていますよ。 > MsgBox bbb, vbOKOnly でも、これは問題です。VB6の文字列は、内部バイナリが UTF-16形式の データになっているべきですから、Shift_JISのバイナリを持つ文字列を、 MsgBox に表示させると、再度変換が行われ、文字が化けます。 ためしに、以下のコードを実行してみてください。 Dim a() As Byte, b() As Byte a = "日付" b = StrConv(a, vbFromUnicode) Debug.Print Hex(a(0)), Hex(a(1)), Hex(a(2)), Hex(a(3)) Debug.Print Hex(b(0)), Hex(b(1)), Hex(b(2)), Hex(b(3)) Unicodeデータの "日付" が、正しく Shift_JIS のバイナリになっているはずです。 > それとも他に原因が・・・ 勘違いしないでいただきたいのは、これらの変換は、あくまで、 「VB6の文字列の内部処理形式」の話だという事です。 VB6の標準コントロールやMsgBox関数自体は、ANSIベースのウィンドウです。 つまり、Unicodeには対応していないので、注意してください。 ちょっとややこしいのですが、MsgBox 関数などに渡されたデータは、 VBが表示のたびに、Unicode → Shift_JIS変換を自動で行う仕様です。 ですから、Shift_JISのバイナリを渡すと、Unicode → Shift_JIS変換が さらに行われてしまい、データが破損するというわけですね。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.