В рамках моей «работы» над стандартизацией C# 5 в технической группе [ECMA-334 TC49-TG2][1] мне посчастливилось увидеть несколько интересных способов, которыми [Владимир Решетников][2] проверял C# на прочность. В данной статье описана одна из проблем, которые он поднял. Разумеется, она, скорее всего, никак не затронет 99.999% C#-разработчиков… но разобраться все равно любопытно. Спецификации, используемые в статье:
* Стандарт [Unicode 7.0.0][3] – в особенности, [глава 3][4]
* [C# 5][5] (Документ Word)
* [ECMA-335 ][6](Спецификация CLI)
Как бы вы объявили тип `string` (или `System.String`)? Я могу предположить несколько вариантов ответа на данный вопрос, от расплывчатых до довольно конкретных:
* «Какой-нибудь текст в кавычках»
* Последовательность символов
* Последовательность символов Юникода
* Последовательность 16-битных символов
* Последовательность кодов UTF-16
Только последнее утверждение полностью верно. Спецификация C# 5 (раздел 1.3) гласит:
> Обработка строк и символов в C# использует UTF-16. Тип
>
> `char`
>
> представляет код UTF-16, а тип string – последовательность кодов UTF-16.
>
>
Пока всё в порядке. Но это C#. А как насчет IL? Что используется там, и имеет ли это значение? Оказывается, что имеет… Строки должны быть объявлены в IL как константы, и природа этого способа представления важна – не только кодировка, но и интерпретация этих закодированных данных. В частности, последовательность кодов UTF-16 не всегда может быть представлена в виде последовательности кодов UTF-8. [Читать дальше →][7]
[1]:
http://www.ecma-international.org/memento/TC49-TG2.HTM
[2]:
https://twitter.com/vreshetnikov
[3]:
http://www.unicode.org/versions/Unicode7.0.0/
[4]:
http://www.unicode.org/versions/Unicode7.0.0/ch03.pdf
[5]:
http://www.microsoft.com/en-us/download/details.aspx?id=7029
[6]:
http://www.ecma-international.org/publications/standards/Ecma-335.htm
[7]:
http://habrahabr.ru/post/243523/#habracut