Обновление
На основе экспериментов с использованием компилятора C # + ildasm.exe: возможно, причина в отсутствии списка экранированных символов в том, что их так мало: именно 6.
Исходя из IL, сгенерированного ildasm, из программ на C #, скомпилированных Visual Studio 2010 :
- IL строго ASCII .
- Три традиционных пробельных символа экранированы
\t
: 0x09: (вкладка)
\n
: 0x0A: (новая строка)
\r
: 0x0D: (возврат каретки)
- Три знака препинания экранированы:
\"
: 0x22: (двойная кавычка)
\?
: 0x3F: (знак вопроса)
\\
: 0x5C: (обратная косая черта)
- Только следующие символы включены в целые строки 0x20 - 0x7E (не считая трех знаков пунктуации)
- Все остальные символы , включая символы ASCII contrl ниже 0x20 и все от 0x7F и выше, преобразуются в байтовые массивы. Или, скорее, любая строка, содержащая любой символ, отличный от 92 литерала и 6 экранированных символов выше, преобразуется в байтовый массив, где байтами являются байты little-endian строки UTF-16.
Пример 1: ASCII выше 0x7E: простой акцентированный é (U + 00E9)
C #: либо "é"
, либо "\u00E9"
становится (E9
байт приходит сначала )
ldstr bytearray (E9 00 )
Пример 2: UTF-16: символ суммирования ∑ (U + 2211)
C #: либо "∑"
, либо "\u2211"
становится (11
байт приходит сначала )
ldstr bytearray (11 22 )
Пример 3: UTF-32: Двойной математический ? (U + 1D538)
C #: становится либо "?"
, либо суррогатная пара UTF-16 "\uD835\uDD38"
(байты внутри символа обращены, но двухбайтовые символы в общем порядке)
ldstr bytearray (35 D8 38 DD )
Пример 4: Преобразование байтового массива для всей строки, содержащей не-Ascii символ
C #: "In the last decade, the German word \"über\" has come to be used frequently in colloquial English."
становится
ldstr bytearray (49 00 6E 00 20 00 74 00 68 00 65 00 20 00 6C 00
61 00 73 00 74 00 20 00 64 00 65 00 63 00 61 00
64 00 65 00 2C 00 20 00 74 00 68 00 65 00 20 00
47 00 65 00 72 00 6D 00 61 00 6E 00 20 00 77 00
6F 00 72 00 64 00 20 00 22 00 FC 00 62 00 65 00
72 00 22 00 20 00 68 00 61 00 73 00 20 00 63 00
6F 00 6D 00 65 00 20 00 74 00 6F 00 20 00 62 00
65 00 20 00 75 00 73 00 65 00 64 00 20 00 66 00
72 00 65 00 71 00 75 00 65 00 6E 00 74 00 6C 00
79 00 20 00 69 00 6E 00 20 00 63 00 6F 00 6C 00
6C 00 6F 00 71 00 75 00 69 00 61 00 6C 00 20 00
45 00 6E 00 67 00 6C 00 69 00 73 00 68 00 2E 00 )
Напротив, «вы не можете» (найдите список MSIL экранированных строк), но вот некоторые полезные лакомые кусочки ...
ECMA-335 , который содержит строгое определение CIL, не указывает, какие символы должны быть экранированы в литералах QSTRING, только то, что они могут экранироваться с помощью обратной косой черты \
персонаж. Наиболее важные примечания:
- Литералы Unicode представлены как восьмеричные , а не шестнадцатеричные (т. Е.
\042
, а не \u0022
).
- Строки могут быть разбиты на несколько строк с помощью символа
\
- см. Ниже
Единственное явное упоминание об экранировании - это табуляция \t
, перевод строки \n
и восьмеричное числовое экранирование. Это немного раздражает для ваших целей, так как C # не имеет восьмеричного литерала - вам придется делать свое собственное извлечение и преобразование, например, используя метод Convert.ToInt32([string], 8)
.
Кроме того, выбор escape-кодов "зависит от реализации" для "гипотетического IL-ассемблера", описанного в спецификации. Таким образом, ваш вопрос справедливо спрашивает о правилах для MSIL , который является строгой реализацией CIL от Microsoft. Насколько я могу судить, MS не задокументировала свой выбор побегов. Это может быть полезно, по крайней мере, спросить людей Mono, что они используют. Кроме того, это может быть вопросом генерации списка самостоятельно - создайте программу, которая объявляет строковый литерал для каждого символа \u0000
- что угодно, и посмотрите, что представляют собой скомпилированные операторы ldstr
. Если я доберусь до этого первым, я обязательно опубликую свои результаты.
Дополнительные примечания:
Чтобы правильно проанализировать * строковые литералы IL - известные как QSTRINGS или SQSTRINGS - вам придется учитывать не только экранирование символов. Возьмите, например, конкатенацию строк в коде (дословно из Раздела II :: 5.2):
Оператор «+» может использоваться для объединения строковых литералов.Таким образом, длинная строка может быть разбита на несколько строк с помощью «+» и новой строки в каждой строке.Альтернативой является использование «\» в качестве последнего символа в строке, и в этом случае этот символ и разрыв строки после него не вводятся в сгенерированную строку.Любые пробельные символы (пробел, перевод строки, возврат каретки и табуляция) между "\" и первым непробельным символом в следующей строке игнорируются.[Примечание: чтобы включить символ двойной кавычки в QSTRING, используйте восьмеричную escape-последовательность.конечное примечание]
Пример: следующий результат в строках, эквивалентных «Hello World from CIL!»:
ldstr "Hello " + "World " + "from CIL!"
ldstr "Hello World\
\040from CIL!"