QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

[VB.NET]コード変換

こんにちは。
VB.NETでEUC文字をUNICODEへ変換し、テキストボックスへ表示したいのですが、
うまく変換できません。
EUC文字を、そのままテキストボックスに表示した時と、同じ文字が表示されます。
以下がソースですが、どこかまずいでしょうか?
Encoding.Convertで取得するバイト配列は、変換されているようなのですが・・・

よろしくお願いします。



Dim euc As Encoding = Encoding.GetEncoding("euc-jp")
Dim uni As Encoding = Encoding.Unicode

'EucStrにEUC文字が入ります。
Dim eucBytes As Byte() = euc.GetBytes(EucStr)
Dim uniBytes As Byte() = Encoding.Convert(euc, uni, eucBytes)

TextBox1.Text = uni.GetString(uniBytes)

質問者:やぎ

回答

'EucStrにEUC文字が入ります。
Dim eucBytes As Byte() = euc.GetBytes(EucStr)

EucStrには、具体的に何が入っていますか?
EucStrは何型ですか?(char配列?String? いずれにしても何かおかしいと思います)
EUC文字が入っているとはどういう状態でしょうか?

通常、EncodingのGetBytesメソッドは、文字列(つまりユニコード)のデータから、各エンコードを施したバイト列を取得するために使用します。

Dim uniBytes As Byte() = Encoding.Convert(euc, uni, eucBytes)

これを見ると、EUCのバイト列を得るために前の処理を行っているようですが、普通は、もともとEUCのバイト列は手元にあるはずだと思います。
# ちょっと表現等がおかしいですが、EUCの文字列をEUCでエンコードしたら、EUCにはなりませんね。

普通は、単純にEUCのEncodingを取得後、GetStringメソッドにEUCのバイト列を渡せばそれですむはずだと思うのですが?

投稿者:なちゃ

編集 履歴 (0)

なちゃさん ありがとうございます。

'EucStrにEUC文字が入ります。

Dim eucBytes As Byte() = euc.GetBytes(EucStr)

EucStrには、具体的に何が入っていますか?

EucStrは何型ですか?(char配列?String? いずれにしても何かおかしいと思います)

EUC文字が入っているとはどういう状態でしょうか?

EucStrには、Solaris上のDBから取得したデータが入っている訳ですが、
String型で全角の日本語文字列です。

通常、EncodingのGetBytesメソッドは、文字列(つまりユニコード)のデータから、各エンコードを施したバイト列を取得するために使用します。

Dim uniBytes As Byte() = Encoding.Convert(euc, uni, eucBytes)

これを見ると、EUCのバイト列を得るために前の処理を行っているようですが、普通は、もともとEUCのバイト列は手元にあるはずだと思います。

ちょっと表現等がおかしいですが、EUCの文字列をEUCでエンコードしたら、EUCにはなりませんね。

普通は、単純にEUCのEncodingを取得後、GetStringメソッドにEUCのバイト列を渡せばそれですむはずだと思うのですが?

以下のようなことをすれば良いということでしょうか?
やってみましたが、結果は変わりませんでした。



Dim euc As Encoding = Encoding.GetEncoding("euc-jp")
Dim eucBytes As Byte() = euc.GetBytes(EucStr)
TextBox1.Text = euc.GetString(eucBytes) 

やり方違ってますか?
よろしくお願いします。

投稿者:やぎ

編集 履歴 (0)

やぎさんの書き込み (2003-09-17 23:29) より:

EucStrには、Solaris上のDBから取得したデータが入っている訳ですが、

String型で全角の日本語文字列です。

まず、String型の仕様については理解しているでしょうか?
String クラス

テキスト、つまり一連の Unicode 文字を表します。

普通、DBからString型として取得する時点で、データプロバイダがEUCからUnicodeに変換している……と思います。

……それで、EucStrには何が、どのような形式で入っていますか?

[ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2003-09-18 08:21 ]

投稿者:ぢゃん♪

編集 履歴 (0)

ぢゃん♪さんの書き込み (2003-09-18 08:17) より:

まず、String型の仕様については理解しているでしょうか?

テキスト、つまり一連の Unicode 文字を表します。

そうでした・・・。
申し訳ありません。

普通、DBからString型として取得する時点で、データプロバイダがEUCからUnicodeに変換している……と思います。

……それで、EucStrには何が、どのような形式で入っていますか?

あるミドルウェアを使用してデータを取得している訳ですが、
EucStrをファイルに出力し、ファイルの中を見ると期待した文字列が
出力されています。(エディタはファイルがEUCと認識している。)
現在のところ、Byte配列として受け取ることが出来ないようなので、
ミドルウェアで側でUnicode変換してもらうか、Byte配列として受け取れる
ようにしてもらうしかないですかね。
または、自前でコード変換を行うか。。。

投稿者:やぎ

編集 履歴 (0)

あるミドルウェアを使用してデータを取得している訳ですが、

EucStrをファイルに出力し、ファイルの中を見ると期待した文字列が

出力されています。(エディタはファイルがEUCと認識している。)

ファイルにはどのように出力しましたか?
出力をどのように行ったかで、書き込まれる結果は変わってきます。
# 文字コード絡みでは、この辺の情報が重要です。

なんとなく、UTF-8で出力して、EucStrの下位バイトだけ書き込まれる形になって、結果EUCになってるのかなという気はしますが。

この場合だと、EucStrの下位バイトのみを取り出してバイト配列を作成すれば、EUCのバイト列を得ることが出来るはずです。

UTF8Encoding でも使って無理やり下位バイト列に変換するか(ASCIIEncodingだと7ビットしか駄目っぽいので)、Convert.ToByteなどを使って、一文字ずつバイト列を取り出すかすれば出来るんじゃないかと思います。
# 取り合えず思いついたものです、もっと適切な方法があるかもしれませんが。

まずは、EucStrの中身自体を確認するのが先決かと思います(実行時に実際にどのような値が入っているかです)。

投稿者:なちゃ

編集 履歴 (0)

こんにちは。

 つまり、

 データベースより、“あるミドルウェア”を使ってVB.NETで作ったプログラムにデータを読み込んだが、EUC-JPコードで返ってきているのでVB.NET上で文字として表示できない

ということでしょうか?

 “他社製”はOracleしか使っていませんが、Oracle製のデータプロバイダは、データベース中にShift-JISで記入されていてもUnicode(UTF-8?)で返してくれます。同じプロバイダで、Borland製のツールに読み込むとShift-JISで返します。返すのか、それぞれのプロバイダを呼んでいるライブラリで変換しているか、どちらかでしょう。文字コード云々より、“あるミドルウェア”か、それの使い方の問題であるような気がしますが、如何でしょう?

 「そうかもしれない」と思われたらな、使用されているデータベース、“あるミドルウェア”と、データ取り込みのあたりのコードを提供してください。

投稿者:Jitta

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。