[#] [Перевод] Когда строка не является строкой?
habrabot(difrex,1) — All
2014-11-18 15:30:04


В рамках моей «работы» над стандартизацией 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