Unicode

# Unicode.julia_chartransformFunction

Unicode.julia_chartransform(c::Union{Char,Integer})

Сопоставляет символ Unicode (Char) код символа (Integer) c с соответствующим эквивалентным символом или кодом символа согласно пользовательской эквивалентности, используемой в анализаторе Julia (дополнительно к нормализации NFC).

Например, анализатор Julia рассматривает 'µ' (U+00B5 micro) как эквивалент 'μ' (U+03BC mu), поэтому функция julia_chartransform выполняет это преобразование, оставляя другие символы без изменений.

julia> Unicode.julia_chartransform('µ')
'μ': Unicode U+03BC (category Ll: Letter, lowercase)

julia> Unicode.julia_chartransform('x')
'x': ASCII/Unicode U+0078 (category Ll: Letter, lowercase)

julia_chartransform в основном используется для передачи в функцию Unicode.normalize, чтобы имитировать нормализацию, используемую анализатором Julia:

julia> s = "µö"
"µö"

julia> s2 = Unicode.normalize(s, compose=true, stable=true, chartransform=Unicode.julia_chartransform)
"μö"

julia> collect(s2)
2-element Vector{Char}:
 'μ': Unicode U+03BC (category Ll: Letter, lowercase)
 'ö': Unicode U+00F6 (category Ll: Letter, lowercase)

julia> s2 == string(Meta.parse(s))
true
Совместимость: Julia 1.8

Эта функция появилась в версии Julia 1.8.

# Unicode.isassignedFunction

Unicode.isassigned(c) -> Bool

Возвращает true, если заданный символ или код символа является присваиваемым кодом символа Юникода.

Примеры

julia> Unicode.isassigned(101)
true

julia> Unicode.isassigned('\x01')
true

# Unicode.isequal_normalizedFunction

isequal_normalized(s1::AbstractString, s2::AbstractString; casefold=false, stripmark=false, chartransform=identity)

Возвращает, являются ли s1 и s2 канонически эквивалентными строками Unicode. Если casefold=true, игнорирует регистр (выполняет выравнивание регистра символов Unicode). Если stripmark=true, удаляет диакритические знаки и другие комбинируемые символы.

Как и в случае с Unicode.normalize, вы также можете передать произвольную функцию через ключевое слово chartransform (сопоставляя коды символов Integer с кодами символов) для выполнения пользовательских нормализаций, например Unicode.julia_chartransform.

Примеры

Например, строку "noël" в Unicode можно построить двумя канонически эквивалентными способами в зависимости от того, формируется ли "ë" из одного кода символа U+00EB или из символа ASCII 'o', за которым следует комбинируемый символ тремы U+0308.

julia> s1 = "noël"
"noël"

julia> s2 = "noël"
"noël"

julia> s1 == s2
false

julia> isequal_normalized(s1, s2)
true

julia> isequal_normalized(s1, "noel", stripmark=true)
true

julia> isequal_normalized(s1, "NOËL", casefold=true)
true

# Unicode.normalizeFunction

Unicode.normalize(s::AbstractString; keywords...)
Unicode.normalize(s::AbstractString, normalform::Symbol)

Нормализует строку s. По умолчанию каноническая компоновка (compose=true) выполняется без обеспечения стабильности версий Unicode (compat=false), что позволяет получить максимально короткую эквивалентную строку, но может привести к появлению символов компоновки, отсутствующих в более ранних версиях Unicode.

В качестве альтернативы можно указать одну из четырех «нормальных форм» стандарта Unicode: normalform может быть :NFC, :NFD, :NFKC или :NFKD. Нормальные формы C (каноническая компоновка) и D (каноническое разложение) преобразуют различные визуально идентичные представления одной и той же абстрактной строки в единую каноническую форму, причем форма C является более компактной. Нормальные формы KC и KD дополнительно канонизируют «эквиваленты совместимости»: они преобразуют абстрактно похожие, но визуально различающиеся символы в единый канонический вариант (например, расширяют лигатуры в отдельные символы), причем форма KC является более компактной.

Или же более детализированного контроля и дополнительных преобразований можно добиться путем вызова Unicode.normalize(s; keywords...), где указано любое количество следующих логических параметров ключевых слов (по умолчанию все из них имеют значение false, кроме compose):

  • compose=false: не выполнять каноническую компоновку

  • decompose=true: выполнять каноническое разложение вместо канонической компоновки (compose=true игнорируется при наличии)

  • compat=true: эквиваленты совместимости канонизируются

  • casefold=true: выполнять выравнивание регистра символов Unicode, например для нечувствительного к регистру сравнения строк

  • newline2lf=true, newline2ls=true или newline2ps=true: преобразовывать различные последовательности новой строки (LF, CRLF, CR, NEL) в символ перевода строки (LF), разделения строки (LS) или или разделения абзаца (PS), соответственно

  • stripmark=true: удалять диакритические знаки (например, акценты)

  • stripignore=true: удалять игнорируемые по умолчанию символы Unicode (например, мягкий дефис или метку слева направо)

  • stripcc=true: удалять управляющие символы; символы горизонтальной табуляции и символы перевода страницы преобразуются в пробелы; символы перевода строки также преобразуются в пробелы, если не был указан флаг преобразования перевода строки

  • rejectna=true: выдавать ошибку при обнаружении неприсвоенных кодов символов

  • stable=true: обеспечивать стабильность управления версиями Unicode (никогда не вводить символы, отсутствующие в более ранних версиях Unicode)

Вы также можете использовать ключевое слово chartransform (по умолчанию identity) для передачи произвольной функции, сопоставляющей коды символов Integer с кодами символов, которая вызывается для каждого символа s при его обработке, чтобы выполнить произвольную дополнительную нормализацию. Например, передав chartransform=Unicode.julia_chartransform, можно применить несколько специфических для Julia нормализаций символов, которые выполняются в Julia при анализе идентификаторов (дополнительно к нормализации NFC: compose=true, stable=true).

Например, NFKC соответствует параметрам compose=true, compat=true, stable=true.

Примеры

julia> "é" == Unicode.normalize("é") #LHS: Unicode U+00e9, RHS: U+0065 & U+0301
true

julia> "μ" == Unicode.normalize("µ", compat=true) #LHS: Unicode U+03bc, RHS: Unicode U+00b5
true

julia> Unicode.normalize("JuLiA", casefold=true)
"julia"

julia> Unicode.normalize("JúLiA", stripmark=true)
"JuLiA"
Совместимость: Julia 1.8

Для именованного аргумента chartransform требуется версия не ниже Julia 1.8.

# Unicode.graphemesFunction

graphemes(s::AbstractString) -> GraphemeIterator

Возвращает итератор подстрок для s, которые соответствуют расширенным графемам в строке, как определено в Unicode UAX #29. (В общих чертах это то, что пользователи воспринимают как отдельные символы, хотя они могут содержать несколько кодов символов, например буква в сочетании со знаком акцента — это одна графема.)

graphemes(s::AbstractString, m:n) -> SubString

Возвращает подстроку SubString строки s, состоящую из графем с m-й по n-ю из строки s, где второй аргумент m:n — это целочисленный диапазон AbstractUnitRange.

Это примерно соответствует «символам» m:n строки, как видит их пользователь. Пример:

julia> s = graphemes("exposé", 3:6)
"posé"

julia> collect(s)
5-element Vector{Char}:
 'p': ASCII/Unicode U+0070 (category Ll: Letter, lowercase)
 'o': ASCII/Unicode U+006F (category Ll: Letter, lowercase)
 's': ASCII/Unicode U+0073 (category Ll: Letter, lowercase)
 'e': ASCII/Unicode U+0065 (category Ll: Letter, lowercase)
 '́': Unicode U+0301 (category Mn: Mark, nonspacing)

Состоит из кодовых позиций (Char) с 3-й по 7-ю в "exposé", потому что графема "é" на самом деле представлена двумя кодовыми позициями Юникода ('e' и символом комбинирования со знаком акута U+0301).

Так как для нахождения границ графем требуется перебор содержимого строки, время выполнения функции graphemes(s, m:n) пропорционально длине строки (количеству кодовых позиций) до конца подстроки.

Совместимость: Julia 1.9

Для аргумента m:n функции graphemes требуется версия Julia 1.9.