2010-10-08 3 views
2

У меня есть некоторый код, чтобы вывести строки на стандартный вывод, чтобы проверить их кодировку, это выглядит следующим образом:C кодирования # символ/байт равенства

private void DumpString(string s) 
    { 
     System.Console.Write("{0}: ", s); 
     foreach (byte b in s) 
     { 
      System.Console.Write("{0}({1}) ", (char)b, b.ToString("x2")); 
     }  
     System.Console.WriteLine(); 
    } 

Рассмотрим две строки, каждая из которых выглядят как «ë», но с различные кодировки. DumpString произведет следующий вывод:

ë: е (65) (08)
ë: ë (ЕВ)

код выглядит следующим образом:

DumpString(string1); 
DumpString(string2); 

Как я могу преобразовать string2, используя System.Text.Encoding, чтобы быть байтом, эквивалентным string1.

ответ

7

У них нет разных кодировок. Строки в C# всегда UTF-16 (таким образом, вы не должны использовать byte для перебора строк, потому что вы потеряете верхние 8 бит). У них разные - normalization forms.

Ваша первая строка "\ u0065 \ u0308": ЛАТИНСКАЯ МАЛЕНЬКАЯ ПИСЬМА E + КОМБИНИРОВАННАЯ ДИАЕРЕЗ. Это разложенная форма (NFD).

Второй - «\ u00EB»: ЛАТИНСКАЯ МАЛЕНЬКАЯ ПИСЬМА E С ДИАЭРОССИЕЙ. Это предварительно составленная форма (NFC).

Вы можете конвертировать между собой файл string.Normalize.

Смежные вопросы