C # символ / байт кодировки равенства - PullRequest
2 голосов
/ 08 октября 2010

У меня есть некоторый код для вывода строк в stdout для проверки их кодировки, это выглядит так:

    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 выдаст следующий вывод:

ë: e (65) (08)
ë: ë (eb)

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

DumpString(string1);
DumpString(string2);

Как преобразовать строку2, используя System.Text.Encoding, в байтовый эквивалент строки1.

Ответы [ 2 ]

7 голосов
/ 08 октября 2010

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

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

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

Вы можете конвертировать между ними с помощью string.Normalize.

4 голосов
/ 08 октября 2010

Вы ищете String.Normalize метод .

...