112

私はこのトピックについてグーグルで検索し、すべての回答を見てきましたが、まだわかりません。

基本的に、UTF-8 文字列を ISO-8859-1 に変換する必要があり、次のコードを使用して実行します。

Encoding iso = Encoding.GetEncoding("ISO-8859-1");
Encoding utf8 = Encoding.UTF8;
string msg = iso.GetString(utf8.GetBytes(Message));

私のソース文字列は

Message = "ÄäÖöÕõÜü"

しかし、残念ながら私の結果の文字列は

msg = "�ä�ö�õ�ü

ここで何が間違っていますか?

4

9 に答える 9

193

Encoding.Convertを使用してバイト配列を調整してから、目的のエンコーディングにデコードしてください。

Encoding iso = Encoding.GetEncoding("ISO-8859-1");
Encoding utf8 = Encoding.UTF8;
byte[] utfBytes = utf8.GetBytes(Message);
byte[] isoBytes = Encoding.Convert(utf8, iso, utfBytes);
string msg = iso.GetString(isoBytes);
于 2009-12-17T14:47:39.750 に答える
29

あなたの問題は、utf8文字列を表すバイトが別のものとして解釈されると同じ文字列になると想定していることだと思います(iso-8859-1)。そして、それは単にそうではありません。Joel spolsky によるこの優れた記事を読むことをお勧めします。

于 2009-12-17T14:45:50.300 に答える
17

これを試して:

Encoding iso = Encoding.GetEncoding("ISO-8859-1");
Encoding utf8 = Encoding.UTF8;
byte[] utfBytes = utf8.GetBytes(Message);
byte[] isoBytes = Encoding.Convert(utf8,iso,utfBytes);
string msg = iso.GetString(isoBytes);
于 2009-12-17T14:47:23.333 に答える
9

最初に文字列のソースを修正する必要があります。

.NET の文字列は、実際には 16 ビットの Unicode コードポイント (文字) の単なる配列であるため、文字列は特定のエンコーディングではありません。

その文字列を取得して一連のバイトに変換すると、エンコーディングが機能します。

いずれにせよ、ある文字セットで文字列をバイト配列にエンコードし、それを別の文字セットでデコードする方法は、ご覧のとおり機能しません。

元の文字列がどこから来ているのか、なぜ間違ってエンコードされていると思われるのか、詳しく教えていただけますか?

于 2009-12-17T14:44:54.327 に答える
8

少し奇妙なコードのようです。Utf8 バイト ストリームから文字列を取得するには、次の手順を実行する必要があります。

string str = Encoding.UTF8.GetString(utf8ByteArray);

iso-8859-1 バイト ストリームをどこかに保存する必要がある場合は、次のコードを使用します。

byte[] iso88591data = Encoding.GetEncoding("ISO-8859-1").GetBytes(str);
于 2014-06-13T08:54:56.663 に答える
0

ネイサンのソリューションを使用しただけで、正常に動作します。ISO-8859-1 を Unicode に変換する必要がありました。

string isocontent = Encoding.GetEncoding("ISO-8859-1").GetString(fileContent, 0, fileContent.Length);
byte[] isobytes = Encoding.GetEncoding("ISO-8859-1").GetBytes(isocontent);
byte[] ubytes = Encoding.Convert(Encoding.GetEncoding("ISO-8859-1"), Encoding.Unicode, isobytes);
return Encoding.Unicode.GetString(ubytes, 0, ubytes.Length);
于 2014-06-27T13:55:35.993 に答える