Spec-Zone.ru › Elixir 1.15

Синтаксис Юникода

Elixir поддерживает Юникод на протяжении всего языка.

Строки ("olá") и списки символов ('olá') поддерживают Юникод с Elixir v1.0. Строки закодированы в UTF-8. Списки символов представляют собой списки точек кода Юникода. В таких случаях содержимое сохраняется в том виде, в котором его ввели разработчики, без каких-либо преобразований.

Elixir также поддерживает Юникод в переменных, атомах и вызовах с Elixir v1.5. Цель данного документа — предоставить общее введение в то, как Elixir позволяет использовать Юникод в своём синтаксисе. Мы также предоставляем техническую документацию, описывающую, как Elixir соответствует спецификации Юникода.

Чтобы проверить версию Юникода вашей текущей установки Elixir, выполните String.Unicode.version().

Введение

Elixir позволяет использовать символы Юникода в переменных, атомах и вызовах. Однако символы Юникода должны соответствовать правилам синтаксиса языка. В частности, переменные и вызовы не могут начинаться с заглавной буквы. В дальнейшем мы будем использовать эти термины как идентификаторы.

Допустимые символы в идентификаторах — это символы, указанные в Юникоде. В целом, это ограничивается символами, обычно используемыми в действующих системах письма человеческих языков. В частности, это исключает такие символы, как эмодзи, альтернативные числовые обозначения, музыкальные ноты и тому подобное.

Elixir накладывает множество ограничений на идентификаторы по соображениям безопасности. Например, слово «josé» можно записать двумя способами в Юникоде: как комбинацию символов j o s é и как комбинацию символов j o s e ́, где ударение является отдельным символом. Первый называется формой NFC, а второй — формой NFD. Elixir нормализует все символы до формы NFC.

Elixir также запрещает смешанные скрипты в большинстве сценариев. Например, нельзя назвать переменную аdmin, где а на кириллице, а остальные символы — на латинице. В таком случае будет выдано следующее сообщение об ошибке:

** (SyntaxError) invalid mixed-script identifier found: аdmin

Mixed-script identifiers are not supported for security reasons. 'аdmin' is made of the following scripts:

  \u0430 а {Cyrillic}
  \u0064 d {Latin}
  \u006D m {Latin}
  \u0069 i {Latin}
  \u006E n {Latin}

Make sure all characters in the identifier resolve to a single script or a highly
restrictive script. See https://hexdocs.pm/elixir/unicode-syntax.html for more information.

Символ должен быть либо полностью кириллическим, либо полностью латинским. Единственные смешанные скрипты, которые разрешает Elixir в соответствии с рекомендациями по строгому использованию Юникода, это:

  • Латиница и иероглифы с бопомофо
  • Латиница и японский
  • Латиница и корейский

Наконец, Elixir также будет выдавать предупреждение о проблемных идентификаторах в одном и том же файле. Например, Elixir выведет предупреждение, если вы используете обе переменные а (кириллица) и а (латиница) в своем коде.

Это общее введение в использование Юникода в идентификаторах Elixir. В кратце, его цель — поддерживать различные используемые сегодня системы письма, сохраняя при этом сам язык Elixir понятным и безопасным.

Подробные технические данные см. в следующих разделах, которые охватывают технические требования к Юникоду.

Приложение Юникода #31

Elixir реализует требования, изложенные в Приложении Юникода #31, версия 15.0.

R1. Стандартные идентификаторы

Общее правило идентификатора Elixir задано следующим образом:

<Identifier> := <Start> <Continue>* <Ending>?

где <Start> использует те же категории, что и в спецификации, но нормализует их в форме NFC (см. R4):

символы, полученные из общей категории Unicode «заглавные буквы», «строчные буквы», «буквы в верхнем регистре», «модификаторы букв», «другие буквы», «буквы-цифры», плюс Other_ID_Start, минус Pattern_Syntax и Pattern_White_Space точки кода

В обозначении множества: [\p{L}\p{Nl}\p{Other_ID_Start}-\p{Pattern_Syntax}-\p{Pattern_White_Space}].

и <Continue> использует те же категории, что и в спецификации, но нормализует их в форме NFC (см. R4):

символы ID_Start, плюс символы, имеющие общую категорию Unicode «неразрывные знаки», «знаки объединения с пробелами», «десятичные числа», «соединительные знаки пунктуации», плюс Other_ID_Continue, минус Pattern_Syntax и Pattern_White_Space точки кода.

В обозначении множества: [\p{ID_Start}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\p{Other_ID_Continue}-\p{Pattern_Syntax}-\p{Pattern_White_Space}].

<Ending> — добавление, специфичное для Elixir, которое включает только точки кода ? (003F) и ! (0021).

В спецификации также указано множество <Medial>, но Elixir не включает в него никаких символов. Поэтому правило идентификатора было упрощено с учётом этого.

Elixir не позволяет использовать ZWJ или ZWNJ в идентификаторах и поэтому не реализует R1a. Символы управления бинаризации также не поддерживаются. R1b гарантируется в целях обратной совместимости.

Атомы

Атомы Юникода в Elixir следуют приведенному выше правилу идентификатора со следующими модификациями:

  • <Start> дополнительно включает точку кода _ (005F)
  • <Continue> дополнительно включает точку кода @ (0040)

Обратите внимание, что атомы также могут быть заключены в кавычки, что позволяет использовать любые символы, такие как :"hello elixir". Все операторы Elixir также являются допустимыми атомами, такими как :+, :@, :|>, и другими. Полное описание допустимых атомов доступно в разделе "Атомы" в справочнике по синтаксису.

Переменные, локальные и удаленные вызовы

Переменные в Elixir следуют приведенному выше правилу идентификатора со следующими модификациями:

  • <Start> дополнительно включает точку кода _ (005F)
  • <Start> дополнительно исключает символы Lu (заглавные буквы) и Lt (буквы в верхнем регистре)

В обозначении множества: [\u{005F}\p{Ll}\p{Lm}\p{Lo}\p{Nl}\p{Other_ID_Start}-\p{Pattern_Syntax}-\p{Pattern_White_Space}].

Псевдонимы

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

R3. Пробелы и символы синтаксиса шаблонов

Elixir поддерживает только точки кода \t (0009), \n (000A), \r (000D) и \s (0020) в качестве пробелов и поэтому не следует требованию R3. R3 требует поддержки более широкого набора пробелов и символов синтаксиса.

R4. Эквивалентные нормализованные идентификаторы

Идентификаторы в Elixir чувствительны к регистру.

Elixir нормализует все атомы и переменные до формы NFC. Однако атомы и строки, заключенные в кавычки, могут иметь любую форму и не проверяются анализатором.

Другими словами, атом :josé может быть записан только с точками кода 006A 006F 0073 00E9 или 006A 006F 0073 0065 0301, но Elixir перепишет его в первый вариант (с Elixir 1.14). С другой стороны, :"josé" может быть записано как 006A 006F 0073 00E9 или 006A 006F 0073 0065 0301, и его форма сохранится, поскольку оно записано в кавычках.

Выбор требования R4 автоматически исключает требования R5, R6 и R7.

Технический стандарт Юникода #39

Elixir соответствует пунктам, изложенным в Техническом стандарте Юникода #39 по безопасности, версия 15.0.

C1. Общий профиль безопасности для идентификаторов

Elixir не позволит токенизацию идентификаторов с точками кода в \p{Identifier_Status=Restricted}.

Реализация, следующая общему профилю безопасности, не допускает символов в \p{Identifier_Status=Restricted}, ...

Например, символ «ЗАПОЛНИТЕЛЬ ХАНГУЛЬ» (ㅤ), который часто не отображается, является необычной точкой кода и вызовет это предупреждение.

См. примечание ниже о дополнительных нормализациях, которые могут производить автоматическую замену некоторых запрещённых идентификаторов.

C2. Обнаружение проблемных идентификаторов

Elixir выведет предупреждение об идентификаторах, которые выглядят одинаково, но на самом деле таковыми не являются. Примеры: в а = a = 1, два символа «a» — это кириллица и латиница, и их можно спутать; в 力 = カ = 1, оба — японские, но разные точки кода, разные системы письма. Проблемные идентификаторы могут привести к трудноуловимым ошибкам (например, из-за скопированного кода) и могут быть небезопасными, поэтому мы будем предупреждать о идентификаторах в одном файле, которые могут быть перепутаны.

Мы используем способы, описанные в разделе 4, «Обнаружение проблемных идентификаторов», с одной отмеченной модификацией

В качестве альтернативы можно объявить об использовании модификации и предоставить точный список отображений символов, которые добавляются или удаляются из предоставленных.

Elixir не будет предупреждать о проблемах с идентификаторами, состоящими исключительно из символов a-z, A-Z, 0-9 и подчеркивания. Это связано с тем, что идентификаторы ASCII существуют так давно, что сообщество программистов разработало собственные способы борьбы с неясностью между идентификаторами, такими как l,1 или O,0 (например, шрифты, предназначенные для программирования, обычно облегчают различие между этими символами).

C3. Обнаружение смешанных скриптов

Elixir не позволит токенизацию идентификаторов со смешанными скриптами, если смешение не является одним из исключений, определенных в UTS 39 5.2, «Высокая строгость». Мы используем способы, описанные в разделе 5.1, «Обнаружение смешанных скриптов», для определения того, происходит ли смешение скриптов, с модификацией, описанной в разделе «Дополнительные нормализации» ниже.

Примеры: Elixir разрешает идентификаторы, такие как 幻ㄒㄧㄤ, даже если они содержат символы из нескольких «скриптов», потому что эти скрипты «разрешаются» в японский при применении правил разрешения из UTS 39 5.1. Он также разрешает атом, такой как :Tシャツ, японское слово для «футболки», которое включает латинскую заглавную букву Т, потому что {Latn, Jpan} является одним из разрешенных смещений скриптов в определении «Высокой строгости» в UTS 39 5.2, и оно «охватывает» строку.

Однако Elixir предотвратит токенизацию кода, такого как if аdmin, do: :ok, else: :err, где набором скриптов для символа «a» является {Кириллица}, но все остальные символы имеют наборы скриптов {Латиница}. Наборы скриптов не разрешаются, и наборы скриптов из определения «Высокой строгости» в UTS 39 5.2 также не охватывают строку, поэтому отображается описательная ошибка.

C4, C5 (неприменимо)

Соответствие требованию 'C4 - Обнаружение уровня ограничения' не заявлено и не относится к идентификаторам в коде; скорее, оно применяется к классификации уровня безопасности заданной произвольной строки в один из 5 уровней ограничений.

Соответствие требованию 'C5 - Обнаружение смешанных чисел' не применимо, так как Elixir не поддерживает числовые значения Юникода.

END_OF_DOCUMENT_MARKER

Дополнения, нормализации и задокументированные изменения UTS 39

Начиная с Elixir 1.14, некоторые кодпоинты в \p{Identifier_Status=Restricted} нормализуются к другим, не ограниченным кодпоинтам.

Изначально это делается только для перевода знака МИКРО µ в греческую строчную му μ.

Это не является изменением положений UTS39 C1 (Общий профиль безопасности) или C2 (Обнаружение конфликтов); однако, это задокументированное изменение C3, «Обнаружение смешанных шрифтов».

Обнаружение смешанных шрифтов модифицируется этими нормализациями в той мере, в которой нормализованному кодпоинту предоставляется объединение наборов символов как для одного, так и для другого символа.

  • Например, в примере МИКРО => МЮ, Микро был символом шрифта «Общие» — тот же шрифт, что и у символа «_» нижнее подчёркивание — и поэтому набор символов нормализованного символа будет {Греческий, Общий}. «Общие» пересекаются со всеми непустыми наборами символов, и таким образом нормализованный символ может использоваться в токенах, написанных любым шрифтом, не вызывая смешивания шрифтов.

  • Нормализованные кодпоинты в этом формате — те, что используются в сообществе и, как ожидается, не вызовут проблем с небезопасным смешиванием шрифтов. Например, кодпоинт МИКРО или МЮ может использоваться в атоме или переменной, связанной с микросекундами.

← Предыдущая страница Типы
Следующая страница → Составление документации

© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.15.4/unicode-syntax.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API