вторник, 18 ноября 2014 г.

[Перевод] Когда строка не является строкой? @habrahabr



В рамках моей «работы» над стандартизацией C# 5 в технической группе ECMA-334 TC49-TG2 мне посчастливилось увидеть несколько интересных способов, которыми Владимир Решетников проверял C# на прочность. В данной статье описана одна из проблем, которые он поднял. Разумеется, она, скорее всего, никак не затронет 99.999% C#-разработчиков… но разобраться все равно любопытно.



Спецификации, используемые в статье:






Что такое строка?




Как бы вы объявили тип 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. Читать дальше →



via Хабрахабр / Интересные / Тематические публикации http://ift.tt/1uCKzyp

Комментариев нет:

Отправить комментарий