web-dev-qa-db-ja.com

C#文字列をUTF-8からISO-8859-1(Latin1)Hに変換しますH

私はこのトピックをグーグルで調べ、すべての答えを調べましたが、まだわかりません。

基本的に、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 = "�ä�ö�õ�ü

ここで私が間違っているのは何ですか?

95
Daniil Harik

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);
157
Nathan Baulch

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

23

これを試して:

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);
14
Manu

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

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

その文字列を取得して、それを一連のバイトに変換すると、エンコードが有効になります。

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

その元の文字列がどこから来たのか、そしてなぜあなたはそれが間違ってエンコードされたと思うのかについて、もっと教えてもらえますか?

少し奇妙なコードのようです。 Utf8バイトストリームから文字列を取得するために必要なことは、次のとおりです。

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

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

byte[] iso88591data = Encoding.GetEncoding("ISO-8859-1").GetBytes(str);
6
Sander A
Encoding targetEncoding = Encoding.GetEncoding(1252);
// Encode a string into an array of bytes.
Byte[] encodedBytes = targetEncoding.GetBytes(utfString);
// Show the encoded byte values.
Console.WriteLine("Encoded bytes: " + BitConverter.ToString(encodedBytes));
// Decode the byte array back to a string.
String decodedString = Encoding.Default.GetString(encodedBytes);
0
Tomáš Opis

Nathanのソリューションを使用しただけで、問題なく機能します。 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);
0
Nicolai Nita