C # Преобразование строки из 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 = "�ä�ö�õ�ü 

Что я здесь делаю неправильно?

Используйте 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); 

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

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

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

Прежде всего вам нужно исправить источник строки.

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

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

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

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

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

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

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

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

Просто использовал решение Натана, и он отлично работает. Мне нужно было преобразовать 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 = "[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);} 
  • C # Справка по чтению иностранных символов с помощью StreamReader
  • Является косой чертой ("/"), эквивалентной закодированной косой чертой ("% 2F") в части пути HTTP-URL
  • Как установить стандартную кодировку в Visual Studio
  • Как преобразовать строку с кодировкой Unicode в строку букв
  • Как сделать кодировку Base64 в node.js?
  • Преобразование строки Unicode в экранированную строку ASCII
  • Как я могу наилучшим образом угадать кодировку, когда спецификация (знак байтового заказа) отсутствует?
  • Ошибка «Unmappable character for encoding UTF-8»
  • Преобразование байтов и символов в Java
  • Как определить кодировку символов текстового файла?
  • В чем разница между кодировками utf8mb4 и utf8 в mysql?
  • Interesting Posts

    Флуктуация ping для определенного ISP-магистрали

    Компиляция PHP на OS X: iconv работает только в том случае, если принудительно до 64-битных

    Windows 7 продолжает переименовывать мой диск в другую букву, когда мой внешний жесткий диск подключен

    Как поместить атрибут кодирования в xml другой, который utf-16 с XmlWriter?

    Если оператор using == дает неожиданный результат

    Как добавить текст в QPlainTextEdit без добавления новой строки и сохранить прокрутку внизу?

    Может ли Grub быть настроен на запоминание последней загруженной ОС?

    Могу ли я уменьшить свой браузер до сетевой активности «голых костей»?

    Почему переменные не могут быть объявлены в инструкции switch?

    Как вы привязываете CollectionContainer к коллекции в модели представления?

    Windows 10 Black Screen с рабочим курсором после входа в систему

    Какой формат жесткого диска я использую для Mac и Windows для записи / чтения?

    Я случайно поменял символическую ссылку / bin / sh

    Можем ли мы использовать синтаксис Razor в ASP.NET Webforms (* .aspx pages)?

    Как установить Защитник Windows / MSE на Server 2012?

    Давайте будем гением компьютера.