С# Преобразование строки из UTF-8 в ISO-8859-1 (Latin1) H
У меня есть googled по этой теме, и я посмотрел на каждый ответ, но я все еще не понимаю.
В основном мне нужно преобразовать строку 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 = "�ä�ö�õ�ü
Что я здесь делаю неправильно?
Ответы
Ответ 1
Используйте 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);
Ответ 2
Я думаю, ваша проблема в том, что вы предполагаете, что байты, представляющие строку utf8, приведут к одной и той же строке при интерпретации как что-то еще (iso-8859-1). И это просто не так. Я рекомендую вам прочитать эту отличную статью от Joel spolsky.
Ответ 3
Попробуйте следующее:
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);
Ответ 4
Вам нужно исправить исходный код в первую очередь.
Строка в .NET на самом деле представляет собой всего лишь массив из 16-разрядных кодовых точек юникода, символов, поэтому строка не имеет какой-либо конкретной кодировки.
Это, когда вы берете эту строку и преобразовываете ее в набор байтов, в которые входит кодирование.
В любом случае, как вы это делали, закодирована строка в массив байтов с одним набором символов, а затем декодирует ее другим, не будет работать, как вы видите.
Можете ли вы рассказать нам больше о том, откуда взялась эта оригинальная строка, и почему вы считаете, что она была закодирована неправильно?
Ответ 5
Кажется, бит странный код. Чтобы получить строку из потока байтов Utf8, вам нужно всего лишь:
string str = Encoding.UTF8.GetString(utf8ByteArray);
Если вам нужно сохранить поток байта iso-8859-1, а затем просто используйте:
дополнительная строка кода для предыдущего:
byte[] iso88591data = Encoding.GetEncoding("ISO-8859-1").GetBytes(str);
Ответ 6
Просто использовал решение 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);
Ответ 7
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);
Ответ 8
Вот пример для 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 = "[email protected]";
SmtpClient client = new SmtpClient("mail.xxxxx.org");
MailMessage message = new MailMessage(Email, "[email protected]", "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);}