Re: Преобразование символов в UTF-8 ?
От: hattab  
Дата: 22.03.11 13:37
Оценка:
Здравствуйте, Cynic, Вы писали:

C> Столкнулся со странным поведение метода Encoding.GetChars:

C>
C> byte[] utf8CharsCode = new [] { 237, 160, 130 }; //0xEDA082 == UTF8+D802
C> char[] utf8Chars = Encoding.UTF8.GetChars(utf8CharsCode);

C> Console.WriteLine(utf8Chars.Count);
C> for(int i = 0; i< utf8Chars.Count; i++)
C>    Console.WriteLine("{0}-й байт : {1}", i + 1,(int)utf8Chars[i]);

C> /*
C> *  Вывод в консоль:
C> *  1-й байт : 65213
C> *  2-й байт : 65215
C> */
C>

C> Хотя символ UTF8 с кодом 0xEDA082 существует, но метод вместо него выкидывает непонятный массив символов со странными значениями. С чего бы это

Во-первых нет никаких символов UTF8. UTF-8 это способ преобразования юникод-кодпоинтов в последовательности байтов. Во-вторых, приведенная последовательность (237, 160, 130) некорректна т.к. после байта-маркера начала последовательности (ED) должен следовать байт со значением в диапазоне 80 — 9F (128 — 159). В-третьих нет ничего удивительно в том, что GetChars для одного юникод-кодпоинта вернет два символа т.к. supplementary-диапазон юникода ( > FFFF) представляется в UTF-16 (а виндовый юникод всегда представлен в UTF-16) в виде суррогатной пары.
avalon 1.0rc3 rev 380, zlib 1.2.3
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.