В рамках моей «работы» над стандартизацией C# 5 в технической группе ECMA-334 TC49-TG2 мне посчастливилось увидеть несколько интересных способов, которыми Владимир Решетников проверял C# на прочность. В данной статье описана одна из проблем, которые он поднял. Разумеется, она, скорее всего, никак не затронет 99.999% C#-разработчиков… но разобраться все равно любопытно.
Спецификации, используемые в статье:
- Стандарт Unicode 7.0.0 – в особенности, глава 3
- C# 5 (Документ Word)
- ECMA-335 (Спецификация 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.Читать полностью »