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

刚刚使用了 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);
于 2014-06-27T13:55:35.993 回答
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);
于 2014-10-26T13:55:15.710 回答
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"
于 2020-12-18T22:49:23.893 回答
-5

这是 ISO-8859-9 的示例;

protected void btnKaydet_Click(object sender, EventArgs e)
{
    Response.Clear();
    Response.Buffer = true;
    Response.ContentType = "application/vnd.openxmlformatsofficedocument.wordprocessingml.documet";
    Response.AddHeader("Content-Disposition", "attachment; filename=XXXX.doc");
    Response.ContentEncoding = Encoding.GetEncoding("ISO-8859-9");
    Response.Charset = "ISO-8859-9";
    EnableViewState = false;


    StringWriter writer = new StringWriter();
    HtmlTextWriter html = new HtmlTextWriter(writer);
    form1.RenderControl(html);


    byte[] bytesInStream = Encoding.GetEncoding("iso-8859-9").GetBytes(writer.ToString());
    MemoryStream memoryStream = new MemoryStream(bytesInStream);


    string msgBody = "";
    string Email = "mail@xxxxxx.org";
    SmtpClient client = new SmtpClient("mail.xxxxx.org");
    MailMessage message = new MailMessage(Email, "mail@someone.com", "ONLINE APP FORM WITH WORD DOC", msgBody);
    Attachment att = new Attachment(memoryStream, "XXXX.doc", "application/vnd.openxmlformatsofficedocument.wordprocessingml.documet");
    message.Attachments.Add(att);
    message.BodyEncoding = System.Text.Encoding.UTF8;
    message.IsBodyHtml = true;
    client.Send(message);}
于 2015-09-17T08:02:40.073 回答