Преобразование из UTF8 в ISO-8859-1 не работает - PullRequest
0 голосов
/ 12 мая 2019

Я хотел бы преобразовать строковую переменную из UTF8 в ISO-8859-1, потому что для специальных символов, таких как ä, ö, ü, я вижу ? в C #. Для достижения этой цели я нашел этот пост . Но это не работает для меня. Я пытался выяснить, почему ....

Я наблюдал байты исходной и преобразованной строки в C # с этим кодом:

 System.IO.MemoryStream stream = new System.IO.MemoryStream();
 System.Runtime.Serialization.IFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
 formatter.Serialize(stream, dt2.Rows[0][0]); // I read my string from a datatable and it is utf8 encoded
  byte[] bytes = stream.GetBuffer(); 

Эта строка кода:

Console.WriteLine(BitConverter.ToString(bytes).Replace("-", ""));

возвращается:

4652495343484BEFBFBD53455A55424552454954554E47454E2020

Теперь я хотел бы кодировать в ISO-8859-1. Для этого я использую этот код:

var srcEncoding = Encoding.Default;   // The original bytes are utf8 hence here "Default"
var destEncoding = Encoding.GetEncoding("ISO-8859-1");
var destBytes = Encoding.Convert(srcEncoding, destEncoding, bytes);

и затем запустите строку кода:

Console.WriteLine(BitConverter.ToString(destBytes).Replace("-", ""));

Я получаю тот же шестнадцатеричный код. Кажется, что преобразование не работает должным образом

4652495343484BEFBFBD53455A55424552454954554E47454E2020

У вас есть идеи, почему конвертация не работает для меня?

Ответы [ 2 ]

2 голосов
/ 12 мая 2019

Ваша строка не содержит a-umlaut.

Содержит «Символ замены Юникода» .

Какое бы преобразование ни происходило до того, как вы получили byte[] bytes уже потеряло свой а-умлаут.

0 голосов
/ 12 мая 2019

Нет причин связываться с MemoryStream с и BinaryFormatter с. Просто используйте методы GetString и GetBytes соответствующего Encoding.

byte[] oldBytes = new byte[] { 0x46, 0x52, 0x49, 0x53, 0x43, 0x48,
    0x4B, 0xEF, 0xBF, 0xBD, 0x53, 0x45, 0x5A, 0x55, 0x42, 0x45, 0x52,
    0x45, 0x49, 0x54, 0x55, 0x4E, 0x47, 0x45, 0x4E, 0x20, 0x20 };
Console.WriteLine($"oldBytes: {BitConverter.ToString(oldBytes)} ({oldBytes.Length})");

string oldStr = Encoding.UTF8.GetString(oldBytes);
Console.WriteLine($"oldStr: <{oldStr}>");

byte[] newBytes = Encoding.GetEncoding("ISO-8859-1").GetBytes(oldStr);
Console.WriteLine($"newBytes: {BitConverter.ToString(newBytes)} ({newBytes.Length})");

string newStr = Encoding.GetEncoding("ISO-8859-1").GetString(newBytes);
Console.WriteLine($"newStr: <{newStr}>");

Выход:

oldBytes: 46-52-49-53-43-48-4B-EF-BF-BD-53-45-5A-55-42-45-52-45-49-54-55-4E-47-45-4E-20-20 (27)
oldStr: <FRISCHK�SEZUBEREITUNGEN  >  
newBytes: 46-52-49-53-43-48-4B-3F-53-45-5A-55-42-45-52-45-49-54-55-4E-47-45-4E-20-20 (25)
newStr: <FRISCHK?SEZUBEREITUNGEN  >  
...