C # Преобразование строки из UTF-8 в ISO-8859-1 (Latin1) H - PullRequest
94 голосов
/ 17 декабря 2009

Я гуглил по этой теме и смотрел каждый ответ, но до сих пор не понимаю.

В основном мне нужно преобразовать строку 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 = "�ä�ö�õ�ü

Что я здесь не так делаю?

Ответы [ 8 ]

152 голосов
/ 17 декабря 2009

Используйте 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);
23 голосов
/ 17 декабря 2009

Я думаю, что ваша проблема в том, что вы предполагаете, что байты, представляющие строку utf8, приведут к той же самой строке при интерпретации как-то еще (iso-8859-1). И это просто не тот случай. Я рекомендую вам прочитать эту прекрасную статью Джоэла Спольски.

14 голосов
/ 17 декабря 2009

Попробуйте это:

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);
8 голосов
/ 17 декабря 2009

Вам необходимо исправить источник строки в первую очередь.

Строка в .NET на самом деле представляет собой просто массив 16-битных кодовых точек Юникода, символов, поэтому строка не находится в какой-либо конкретной кодировке.

Когда вы берете эту строку и конвертируете ее в набор байтов, кодирование вступает в игру.

В любом случае, как вы это сделали, кодировав строку в байтовый массив с одним набором символов, а затем расшифровав его с другим, как вы видите, работать не будет.

Можете ли вы рассказать нам больше о том, откуда взялась эта оригинальная строка, и почему вы думаете, что она была закодирована неправильно?

6 голосов
/ 13 июня 2014

Кажется немного странным кодом. Чтобы получить строку из байтового потока Utf8, все что вам нужно сделать:

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

Если вам нужно сохранить поток байтов iso-8859-1 где-нибудь, просто используйте дополнительная строка кода для предыдущего:

byte[] iso88591data = Encoding.GetEncoding("ISO-8859-1").GetBytes(str);
0 голосов
/ 17 сентября 2015

Вот пример для 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);}
0 голосов
/ 26 октября 2014
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);
0 голосов
/ 27 июня 2014

Только что использовал решение Натана, и оно отлично работает. Мне нужно было конвертировать 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);
...