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

时间:2009-12-17 14:37:57

标签: c# .net 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));

我的源代码是

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

但遗憾的是我的结果字符串变为

msg = "�ä�ö�õ�ü

我在这里做错了什么?

9 个答案:

答案 0 :(得分:149)

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

答案 1 :(得分:23)

我认为你的问题是你假设代表utf8字符串的字节在解释为别的东西时会产生相同的字符串(iso-8859-1)。事实并非如此。我建议你阅读Joel spolsky的this excellent article

答案 2 :(得分: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);

答案 3 :(得分:8)

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

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

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

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

您能告诉我们更多关于原始字符串来自何处的信息,以及您认为编码错误的原因吗?

答案 4 :(得分:6)

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

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

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

byte[] iso88591data = Encoding.GetEncoding("ISO-8859-1").GetBytes(str);

答案 5 :(得分:0)

刚刚使用了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);

答案 6 :(得分:0)

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

答案 7 :(得分:0)

也许能帮上忙
将一个代码页转换为另一个:

    public static string fnStringConverterCodepage(string sText, string sCodepageIn = "ISO-8859-8", string sCodepageOut="ISO-8859-8")
    {
        string sResultado = string.Empty;
        try
        {
            byte[] tempBytes;
            tempBytes = System.Text.Encoding.GetEncoding(sCodepageIn).GetBytes(sText);
            sResultado = System.Text.Encoding.GetEncoding(sCodepageOut).GetString(tempBytes);
        }
        catch (Exception)
        {
            sResultado = "";
        }
        return sResultado;
    }

用法:

string sMsg = "ERRO: Não foi possivel acessar o servico de Autenticação";
var sOut = fnStringConverterCodepage(sMsg ,"ISO-8859-1","UTF-8"));

输出:

"Não foi possivel acessar o servico de Autenticação"

答案 8 :(得分:-5)

以下是ISO-8859-9的样本;

$(".text-warning").hover (
    function() {
        $(this).addClass("text-warning-anim");
    },
    function() {
        $(this).removeClass("text-warning-anim");
    }
);