Здравствуйте, 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) в виде суррогатной пары.