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

我已经在这个话题上search,我已经看过每一个答案,但我仍然没有得到它。

基本上我需要将UTF-8string转换为ISO-8859-1,我使用下面的代码:

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

我的源string是

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

但不幸的是我的结果string变成

 msg = "�ä�ö�õ�ü 

我在这里做错了什么?

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

我认为你的问题是,你认为表示utf8string的字节将被解释为别的东西时会导致相同的string(iso-8859-1)。 而这根本就不是这样。 我build议你阅读Joel spolsky撰写的优秀文章 。

尝试这个:

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

您需要首先修复string的来源。

.NET中的string实际上只是一个16位unicode代码点(字符)的数组,所以一个string没有任何特定的编码。

这是当你把这个string,并将其转换为一组字节编码进场。

无论如何,如你所见,编码一个string到一个字符集的string,然后用另一个string解码,将不起作用。

你能告诉我们更多关于原始string来自哪里,为什么你认为它被编码错误?

似乎有点奇怪的代码。 从Utf8字节stream得到string,你需要做的是:

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

如果您需要将iso-8859-1字节stream保存到某个地方,请使用以下代码:

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

刚刚使用了Nathan的解决scheme,它工作正常。 我需要将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); 
 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); 

这里是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);}