понедельник, 20 мая 2019 г.

Спецификация Go: литералы рун

Литералы рун (Rune literals)

Литерал руны представляет собой константу руны, целочисленное значение, идентифицирующее кодовую точку Unicode. Литерал руны выражается в виде одного или нескольких символов, заключенных в одинарные кавычки, например, 'x' или '\n'. В кавычках может появляться любой символ, кроме новой строки и неэкранированной одинарной кавычки. Символ в кавычках представляет значение Unicode самого символа, а многосимвольные последовательности, начинающиеся с обратной косой черты, кодируют значения в различных форматах.

Самая простая форма представляет один символ в кавычках; поскольку исходный текст Go представляет собой символы Unicode, закодированные в UTF-8, несколько байтов в кодировке UTF-8 могут представлять одно целочисленное значение. Например, литерал 'a' содержит один байт, представляющий литерал a, Unicode U+0061, значение 0x61, в то время как 'ä' содержит два байта (0xc3 0xa4), представляющий литерал a-dieresis, U+00E4, значение 0xe4.

Несколько экранов с обратной косой чертой позволяют кодировать произвольные значения в виде текста ASCII. Существует четыре способа представления целочисленного значения в виде числовой константы: \x, за которой следуют ровно две шестнадцатеричные цифры; \u, за которой следуют ровно четыре шестнадцатеричные цифры; \U, за которой следуют ровно восемь шестнадцатеричных цифр и простой обратный слеш \, за которыми следуют ровно три восьмеричных знака. В каждом случае значение литерала - это значение, представленное цифрами в соответствующей базе.

Хотя все эти представления приводят к целому числу, они имеют разные допустимые диапазоны. Восьмеричные экранирования должны представлять значение от 0 до 255 включительно. Шестнадцатеричные экранирования удовлетворяют этому условию по построению. Экранирующие символы \u и \U представляют кодовые точки Unicode, поэтому в них некоторые значения недопустимы, в частности значения выше 0x10FFFF и суррогатные половины.

После обратной косой черты некоторые односимвольные экранированные символы представляют собой специальные значения:

\a   U+0007 alert or bell
\b   U+0008 backspace (пробел)
\f   U+000C form feed (символ конца страницы)
\n   U+000A line feed or newline (символ возврата строки)
\r   U+000D carriage return (символ возврата каретки)
\t   U+0009 horizontal tab (горизонтальный таб)
\v   U+000b vertical tab (вертикальный таб)
\\   U+005c backslash (обратный слеш)
\'   U+0027 single quote  (одинарная кавычка, валидный экран только внутри литералов рун)
\"   U+0022 double quote  (двойная кавычка, валидный экран только внутри строковых литералов)

Все остальные последовательности, начинающиеся с обратной косой черты, недопустимы внутри литералов рун.

rune_lit         = "'" ( unicode_value | byte_value ) "'" .
unicode_value    = unicode_char | little_u_value | big_u_value | escaped_char .
byte_value       = octal_byte_value | hex_byte_value .
octal_byte_value = `\` octal_digit octal_digit octal_digit .
hex_byte_value   = `\` "x" hex_digit hex_digit .
little_u_value   = `\` "u" hex_digit hex_digit hex_digit hex_digit .
big_u_value      = `\` "U" hex_digit hex_digit hex_digit hex_digit
                           hex_digit hex_digit hex_digit hex_digit .
escaped_char     = `\` ( "a" | "b" | "f" | "n" | "r" | "t" | "v" | `\` | "'" | `"` ) .

Примеры:

'a'
'ä'
'本'
'\t'
'\000'
'\007'
'\377'
'\x07'
'\xff'
'\u12e4'
'\U00101234'
'\''         // литерал руны, содуржащий символ одинарной кавычки
'aa'         // недопустимо: слишком много символов
'\xa'        // недопустимо: слишком мало шестнадцатеричных цифр
'\0'         // недопустимо: слишком мало восьмеричных цифр
'\uDFFF'     // недопустимо: суррогатная половина
'\U00110000' // недопустимо: невалидная Unicode кодовая точка


Читайте также:


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

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