DOBON.NET DOBON.NETプログラミング掲示板過去ログ

UTF-8の文字列の扱いについて

環境/言語:[Windows XP Pro VB.NET 2003]
分類:[.NET]

いつもお世話になっております。

今回お聞きしたいのは、UTF-8の文字化けした日本語文字列を正しい日本語に変換する方法です。
UTF-8の文字コードで受け取った物を文字化け無しで表示したいのですが、どうやったらよいのかわかりません。

メールを受信した際に"text/plain; charset=utf-8"となっているのですが、
内部でみると日本語が文字化けしてしまっているのです。
この文字化けを日本語として正しい表示をしたいのですが、どのような方法が
あるでしょうか?

教えていただければ助かります。

よろしくお願いいたします。

以上
意味が良く分かっていませんので、回答になっていないと思いますが...。

もし受け取ったデータがUTF-8でないということであれば、他の文字コードを試せばよく、もし受け取ったデータが壊れているということであれば、どうしようもない(直す方法があるならば直せるかもしれませんが)のではないでしょうか。
すみませんでした。
質問の仕方が悪かったです。
申し訳ございません。

まずメール受信時の文字コードはUTF-8のはずなのですが、
VB.NETで受信データをそのまま読込むと文字化けを起こします。
これを何とかして通常の日本語文字列に変えたいのですが、そのエンコードがうまくいきません。
実際にメールを受信する部分はこちらにあるメール受信部分を使用しています。
戻ってきた文字列を呼出側で
Dim strtest As String = System.Text.Encoding.GetEncoding("utf-8").GetString(Encoding.GetEncoding("shift_jis").GetBytes(strData))
っとしているのですが、文字列のいくつかの文字が文字化けを起こしてしまうのです。

ただ、文字データは壊れてはいません。
通常のメーラーで受信を行うと文字化けせずに読込めます。
> 戻ってきた文字列を呼出側で
> Dim strtest As String = System.Text.Encoding.GetEncoding("utf-8").GetString(Encoding.GetEncoding("shift_jis").GetBytes(strData))

提示された方法を見る限りでは、

 [元のメールデータ]→(デコード方式は不明?)→[化けた文字列:strData]
  →[GetEncoding("shift_jis").GetBytes()]→[SJISバイナリ化]
  →[GetEncoding("utf-8").GetString()]→[正常な文字列]

という流れのようですが、これだと、解析対象たるデータが、
欠損/破損している可能性がありますので、もはや手遅れだと思います。


しかし strData というのが、デコード前の元の無加工のメールデータ、
たとえば、UTF-8バイナリが base64 にエンコードされた状態の文字列の事を
さしているのだとすれば、おそらくは Convert.FromBase64String と
Encoding.GetString を使う事で、文字列として復元できると思います。

(実際の strData の内容は、どのようになっているのでしょうか?)
> (実際の strData の内容は、どのようになっているのでしょうか?)

Encoding.GetEncoding(50220)でメール受信データをデコードします。
その後Dim strtest As String = System.Text.Encoding.GetEncoding("utf-8").GetString(Encoding.GetEncoding("shift_jis").GetBytes(strData))
としてデコードを行います。(strDataがEncoding.GetEncoding(50220)で行ったデコード結果)

実際のデータは
strData : 繝・せ繝磯∽ソ。繝。繝シ繝ォ
strTest : チEト送信メール
正常データ : テスト送信メール
となります。

Convert.FromBase64StringとEncoding.GetStringについては現在少々ごたついているので、確認出来次第確認結果をこちらに掲載します。
> Encoding.GetEncoding(50220)でメール受信データをデコードします。

すみません。状況が見えないのですが、50220 でのデコード処理を
組みこんでいるのは、どのような理由からでしょうか?

UTF-8 としてエンコードされたデータを、別形式でデコードしてしまえば、
データが化けてみえるどころか、破損してしまうのも、当然だと思いますが…。


提示されたコードを置き換えれば、すなわち、

--------------------------
Dim SourceText As String = "テスト送信メール"
Dim SourceBinary() As Byte = Encoding.UTF8.GetBytes(SourceText)

'Encoding.GetEncoding(50220)でメール受信データをデコードします。
'(strDataがEncoding.GetEncoding(50220)で行ったデコード結果)
Dim strData As String = Encoding.GetEncoding(50220).GetString(SourceBinary)

'その後…(略)…としてデコードを行います。
Dim binData() As Byte = Encoding.GetEncoding("Shift_JIS").GetBytes(strData)
Dim strTest As String = Encoding.GetEncoding("UTF-8").GetString(binData)

'実際のデータは…(略)…となります。
Console.WriteLine(strData) '繝・せ繝磯∽ソ。繝。繝シ繝ォ
Console.WriteLine(strTest)  'チEト送信メール
Console.WriteLine(SourceText) 'テスト送信メール
--------------------------

という事だという事ですよね。


前提にある、最初の『メール受信データ』というのが、上記でいう所の
 Dim SourceText As String = "テスト送信メール"
 Dim SourceBinary() As Byte = Encoding.UTF8.GetBytes(SourceText)
の、いずれの形式で来るのかは知りませんが、いずれにしても、
それなら 50220 でデコードしたりはせず、元データを
 Dim strTest As String = SourceText
あるいは、
 Dim strTest As String = Encoding.UTF8.GetString(SourceBinary)
とすれば、正しい文字列が得られると思いますけれども。
まず、50220でデコードをしているのは、サーバとのメッセージのやり取りをする場合に使用しています。
この部分はこちらのメール送受信のサンプルをしようさせていただいてます。

で実際になぜここでこうなっているかというと。
メールの本文受信時も同じ受信方法で受信している為こういった形になっているのです。

実際であればTOPコマンドか何かでメールのヘッダー情報からエンコード情報を
取得して適宜エンコードするような処理になると思うのですが、
(本当にこんなやりかたで良いのかは判りません。無い知恵を絞ってみたらこんなんでできるかもなぁ〜程度で考えた物なので)
それをせずに何とかならない物かと思いまして、横着した結果です。
お手数おかけしました。申し訳ございません。

メール受信したデータはどう持っとくのが良いのですかね?
実際いTOPコマンドでエンコードを適宜変えていくというのも自身はありませんし。
もう少しいじくってみます。

大変たすかりましたありがとうございます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板