Строковые литералы (String literals)
Строковый литерал представляет собой строковую константу, полученную в результате объединения последовательности символов. Существует две формы: необработанные строковые литералы (raw string literals) и интерпретируемые строковые литералы (interpreted string literals).
Необработанные строковые литералы - это символьные последовательности между обратными кавычками, как в `foo`. В кавычках может появляться любой символ, кроме обратной кавычки. Значение необработанного строкового литерала - это строка, состоящая из неинтерпретированных (неявно кодированных в UTF-8) символов между кавычками; в частности, обратная косая черта не имеет специального значения, и строка может содержать символы новой строки. Символы возврата каретки ('\r') внутри необработанных строковых литералов отбрасываются из необработанного строкового значения.
Интерпретируемые строковые литералы являются символьными последовательностями между двойными кавычками, как в "bar". В кавычках может появляться любой символ, кроме символа новой строки (newline) и неэкранированной двойной кавычки. Текст между кавычками формирует значение литерала, с экранированием обратной косой черты, интерпретируемым так же как в литералах рун (за исключением того, что \' недопустимо, а \" является законным), с теми же ограничениями. Трехзначный восьмеричный (\nnn) и двузначные шестнадцатеричные (\xnn) escape-символы представляют отдельные байты результирующей строки, все другие escape-последовательности представляют (возможно, многобайтовую) кодировку UTF-8 отдельных символов. Таким образом, внутри строкового литерала \377 и \xFF представляют один байт значения 0xFF = 255, тогда как ÿ, \u00FF, \U000000FF и \xc3\xbf представляют два байта 0xc3 0xbf кодировки UTF-8 символа U+00FF (символ ÿ).
string_lit = raw_string_lit | interpreted_string_lit .
raw_string_lit = "`" { unicode_char | newline } "`" .
interpreted_string_lit = `"` { unicode_value | byte_value } `"` .
Примеры:
`abc` // то же самое что и "abc"
`\n
\n` // то же самое что и "\\n\n\\n"
"\n"
"\"" // то же самое что и `"`
"Hello, world!\n"
"日本語"
"\u65e5本\U00008a9e"
"\xff\u00FF"
"\uD800" // недопустимо: суррогатная половина (surrogate half)
"\U00110000" // недопустимо: невалидная Unicode кодовая точка
Следующие примеры представляют одну и ту же строку:
"日本語" // UTF-8 текст ввода
`日本語` // UTF-8 текст ввода как необработанный литерал
"\u65e5\u672c\u8a9e" // явные Unicode кодовые точки
"\U000065e5\U0000672c\U00008a9e" // явные Unicode кодовые точки
"\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e" // явные UTF-8 байты
Если исходный код представляет символ в виде двух кодовых точек, таких как комбинированная форма с акцентом и буквой, результатом будет ошибка, если он помещен в литерал руны (это не одна кодовая точка), и будет отображаться как две кодовые точки, если они помещены в строковый литерал.
Читайте также:
Комментариев нет:
Отправить комментарий