掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
VB6.0 + MySQL 4.1.22 での文字化け (ID:100635)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
「東京」ぐらいなら、どうにか逆変換できますが、文字によっては不可逆となります。 無理に VB 側でコード変換するのではなく、環境設定側を見直すべきかと思いますよ。 (ここは MySQL の掲示板では無いので、設定方法に関する回答がつくかどうかは微妙ですが…) >「東京」「譚ア莠ャ」という2つの文字列があり、「譚ア莠ャ」は「東京」のUTF-8でエンコードされた文字列です。 この部分で、微妙に認識が間違っているようです。 まず、「東京」という文字列が、《UTF-8 でエンコード》された場合、 『E6 9D B1 E4 BA AC』という 6 バイトのバイナリになります。 その 6 バイトのバイナリを、《Shift_JIS と仮定》してデコードすると、 E69D = "譚" B1 = (半角カナの)"ア" E4BA = "莠" AC = (半角カナの)"ヤ" という事で、(見た目上は)「譚ア莠ャ」という 4 文字の文字列になります。 これが、今見えているものの正体でしょう。 そしてそれらのバイナリが、(Byte 配列ではなく)VB の String 型に渡されているため、 実際に変数の内容は《UTF-16 にてエンコード》されて、 "譚" => U+8B5A (半角カナの)"ア" => U+FF71 "莠" => U+83A0 (半角カナの)"ヤ" => U+FF6C すなわち、『5A 8B 71 FF 6C FF』の 6 バイトで格納される事になります。 これが、実際のメモリ上にあるものの正体かと。 > UTF8_TO_UNICODE関数を利用し、「譚ア莠ャ」を「東京」にすることは成功したのですが 残念ながら、それは、たまたまうまくいっただけのように思えます。 現在の関数仕様は、 入力:文字列(UTF-16バイナリ)「譚ア莠ャ」 出力:文字列(UTF-16バイナリ)「東京」 になっていますが、本来は、 入力:UTF-8バイナリ『E6 9D B1 E4 BA AC』 出力:文字列(UTF-16バイナリ)「東京」 であるべきです。関数内のコーディング以前に、関数仕様そのものが不適切です。 一応、今の引数仕様のままでも、呼びだし側で Dim UTF8(5) As Byte UTF8(0) = &HE6 UTF8(1) = &H9D UTF8(2) = &HB1 UTF8(3) = &HE4 UTF8(4) = &HBA UTF8(5) = &HAC Dim s As String s = UTF8 などとして、String 変数に『E6 9D B1 E4 BA AC』という UTF-8 バイナリを代入する事は できますが、その場合の(MsgBox s 等での)見た目上は、「鷦」であるかのように見えるでしょう。 2 文字目は Chr(&HF68A) 、3 文字目はハングルゆえ日本語環境では文字化けします。 # E6 9D => (U+9DE6)"鷦" # B1 E4 => (U+E4B1)" (私用領域の文字) # BA AC => (U+ACBA)ハングル音節文字(Hangul syllable Kiyeok-Yeo-Pieupsios) ということで、変換関数に渡しているという【UTF-8 な東京】が 『E6 9D B1 E4 BA AC』という 6 バイトのバイナリであるのなら、 それを元の「東京」に戻すために、UTF8_TO_UNICODE の実装として (1) Stream をバイナリモードで開く。 (2) そこに、『E6 9D B1 E4 BA AC』を Write する。 (3) Position を先頭に戻し、UTF-8 テキストモードに切り替え。 (4) ReadText で読み込んで「東京」を得る。 という手順を取ることができます。 また、元データが「譚ア莠ャ」という 4 文字の String であるならば、 (1) それらを Byte 配列に無変換代入し、『E6 9D B1 E4 BA AC』を得る。 (2) あとは、先ほどと同様の手順で「東京」を得る。 という流れになります。 # ただし、本来とは異なる Byte 配列が得られた場合は、その時点で # すでにデータが破損しているため、変換処理は続行できません。 なお、逆変換である UNICODE_TO_UTF8 の場合は、渡すべきデータは 「東京」という 2 文字の String からの変換になるはずなので、 (1) Stream を UTF-8 のテキストモードで開く。 (2) "東京" の 2 文字を WriteText する。 (3) Position を先頭に戻し、バイナリモードに切り替え。 (4) Read メソッドで読み込んで、『E6 9D B1 E4 BA AC』のバイナリを得る。 という実装になりますね。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.