ADODB.Streamを使用したEUC文字列→Shift-JIS文字列変換するには?

解決


ben  2007-04-19 05:18:28  No: 98593

ADODB.Streamを使用してEUCからShift-JISに変換できる方法をネットで
見つけました。ですが、「EUCファイル」や「EUCバイナリ」から
の変換は多数ありましたが、「EUC文字列」を変換する方法がどうしても
わかりません。

EUCファイルをバイト配列に読み込み、それをADODB.Streamを使用して
変換するとうまくいきます。
ですが、EUCファイルの内容をString変数に入れてから、バイト配列にコピー
して上記と同じことをすると文字化けしてしまう文字があります。

ADODB.Streamを使用してEUC文字列を変換する方法はあるのでしょうか。


魔界の仮面弁士  2007-04-19 08:03:08  No: 98594

VB.NET なら、System.Text.Encoding を使うと思いますので、
ここでは VB6 であると仮定して回答します。

> 「EUCファイル」や「EUCバイナリ」からの変換は多数ありましたが、
> 「EUC文字列」を変換する方法がどうしてもわかりません。
まず、その「EUC文字列」というのが、どのような物か教えてください。

そもそも、VB における「文字列」は常に Unicode です。別の表現でいうと、
VB の String 型に入るデータは、常に「UTF-16 のバイナリ」である、
ということになります。

String 型には、他の形式のバイナリを含める事はできますが、それをたとえば
TextBox に表示したり、ファイルに出力したりしようとすれば、その時点で
中のバイナリが Unicode とみなして処理されるため、データが破損します。
(文字列として扱わなければ、データは破損しません)

> EUCファイルの内容をString変数に入れてから
?? 意味がわかりません。

「EUCファイル」があるのなら、御自身が既に見つけられた
> 「EUCファイル」や「EUCバイナリ」からの変換は多数ありましたが、
の方法が使えるはずですよね。

そもそも、どのようにしてそれを String 変数に入れたのでしょうか?


ben  2007-04-20 03:24:28  No: 98595

返事遅くなり申し訳ありません。
丁寧な回答有難うございます。

>VB.NET なら、System.Text.Encoding を使うと思いますので、
>ここでは VB6 であると仮定して回答します。
VB6のXPです。

>まず、その「EUC文字列」というのが、どのような物か教えてください。
ソケット通信で受信したデータをString変数に格納しています。
漢字コードがEUCなので解読できない文字列になっているのでEUC文字列
と表現しました。

> EUCファイルの内容をString変数に入れてから
>?? 意味がわかりません。
これはソケット通信でうまくいかないので自分でテストプログラムを作成
しました。ファイルから読み込んだ文字列をString変数にいれたということです。

>「EUCファイル」があるのなら、御自身が既に見つけられた
>> 「EUCファイル」や「EUCバイナリ」からの変換は多数ありましたが、
>の方法が使えるはずですよね。
>そもそも、どのようにしてそれを String 変数に入れたのでしょうか?
テストプログラムではStrConvでやってしまいました。回答して頂いた内容
だと、StrConvを使うとデータが破損してしまうということなのですよね・・・

テストプログラムのことなどわかり難くて申し訳ありません。
本当にやりたいことは、ソケット通信で受信した、EUCの文字列をShift-JIS
に変換したいということです。


魔界の仮面弁士  2007-04-20 05:36:22  No: 98596

>>VB.NET なら、System.Text.Encoding を使うと思いますので、
# あ、こっちは VB2-6用掲示板だったか……。

> ソケット通信で受信したデータをString変数に格納しています。
そこに問題アリ。Byte配列で受けましょう。
Stream.Write メソッドが要求するのは、String ではなく Byte配列ですから。

> 解読できない文字列になっているので
文字コードを扱う時は、バイナリ値を意識しましょう。
たとえば、EUCの[琥]と Shift_JISの[琲]は、いずれも &HE0E8 ですので、
可読文字かどうかだけで判断しても、意味がありません。

> StrConvでやってしまいました。
Stream で変換するという話だったのに、なぜに StrConv を…。(^_^;)


ben  2007-04-20 23:02:27  No: 98597

回答有難うございます。

>> ソケット通信で受信したデータをString変数に格納しています。
>>そこに問題アリ。Byte配列で受けましょう。
>>Stream.Write メソッドが要求するのは、String ではなく Byte配列ですから。

うまく変換できました!
ソケット通信で受信したデータをByte配列で受けれることを学びました。
このような質問にも丁寧に回答していただきホント有難うございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加