C#将字符串从UTF-8转换为ISO-8859-1(Latin1)H

Dan*_*rik 97 .net c# encoding utf-8 iso-8859-1

我已经搜索了这个主题,我看了每个答案,但我仍然没有得到它.

基本上我需要将UTF-8字符串转换为ISO-8859-1,我使用以下代码:

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

我的源字符串是

Message = "ÄäÖöÕõÜü"
Run Code Online (Sandbox Code Playgroud)

但不幸的是我的结果字符串变成了

msg = "�ä�ö�õ�ü
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么?

Nat*_*lch 164

在尝试将字节数组解码为目标编码之前,请使用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);
Run Code Online (Sandbox Code Playgroud)

  • 一个班轮是`Encoding.GetEncoding("ISO-8859-1").GetString(Encoding.Convert(Encoding.UTF8,Encoding.GetEncoding("ISO-8859-1"),Encoding.UTF8.GetBytes(myString)) )` (6认同)
  • 你知道,“isoBytes”也只是“iso.GetBytes(Message);”。这里不需要转换任何东西。事实上,您可以跳过所有这些并说“string msg = Message”。这些转换没有任何实际意义,因为开始和结束都只是一个 .Net“字符串”。只要您不需要将其作为字节处理,文本编码在 .Net `String` 上就无关紧要。 (3认同)

Kla*_*sen 23

我认为你的问题是你假设代表utf8字符串的字节在解释为别的东西时会产生相同的字符串(iso-8859-1).事实并非如此.我建议您阅读Joel spolsky撰写的这篇优秀文章.

  • 确实很棒的文章,而且充满幽默感!我今天在工作中遇到了编码问题,这帮助了我。 (2认同)

Man*_*anu 14

试试这个:

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);
Run Code Online (Sandbox Code Playgroud)

  • 如果string具有非iso字符,则Encoding.Convert会在转换时抛出回退异常 (2认同)

ang*_*son 8

您需要首先修复字符串的来源.

.NET中的字符串实际上只是一个16位unicode代码点,字符的数组,因此字符串不是任何特定的编码.

当你接受该字符串并将其转换为一组字节时,编码就会发挥作用.

在任何情况下,你所做的方式,将字符串编码为具有一个字符集的字节数组,然后用另一个字符集解码,将无法正常工作,如您所见.

你能告诉我们更多关于原始字符串来自哪里,以及为什么你认为它编码错误的原因?

  • 如果我错了,请纠正我,但我的理解是,虽然技术上它"不是任何特定的编码",但.NET字符串是一个字节数组,精确对应于UTF-16文件,字节为字节(不包括BOM).它甚至以相同的方式使用代理(这似乎是编码技巧).当然,您通常希望将文件存储为UTF-8,但将内存中的数据处理为16位.(或32位,以避免代理对的复杂性,但我不确定这是否真的可行.) (2认同)

小智 6

似乎有点奇怪的代码.要从Utf8字节流中获取字符串,您只需要:

string str = Encoding.UTF8.GetString(utf8ByteArray);
Run Code Online (Sandbox Code Playgroud)

如果你需要将iso-8859-1字节流保存到某处,那么只需使用:前面的附加代码行:

byte[] iso88591data = Encoding.GetEncoding("ISO-8859-1").GetBytes(str);
Run Code Online (Sandbox Code Playgroud)