Unicode
Модуль Unicode
предоставляет необходимые функциональные возможности для управления символами и строками Unicode. В их число входят проверка, определение категории, нормализация, преобразование регистра и сегментация графем, которые позволяют эффективно работать с данными в формате Unicode.
#
Unicode
— Module
Модуль Unicode
предоставляет необходимые функциональные возможности для управления символами и строками Юникода. В их число входят проверка, определение категории, нормализация, преобразование регистра и сегментация графем, которые позволяют эффективно работать с данными в формате Юникода.
#
Unicode.julia_chartransform
— Function
Unicode.julia_chartransform(c::Union{Char,Integer})
Сопоставляет символ Юникода (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.isassigned
— Function
Unicode.isassigned(c) -> Bool
Возвращает true
, если заданный символ или целое число является присваиваемой кодовой позицией Юникода.
Примеры
julia> Unicode.isassigned(101)
true
julia> Unicode.isassigned('\x01')
true
#
Unicode.isequal_normalized
— Function
isequal_normalized(s1::AbstractString, s2::AbstractString; casefold=false, stripmark=false, chartransform=identity)
Возвращает значение, указывающее, являются ли s1
и s2
канонически эквивалентными строками Юникода. При casefold=true
игнорирует регистр (выполняет выравнивание регистра символов Юникода). При stripmark=true
удаляет диакритические знаки и другие комбинируемые символы.
Как и в случае с Unicode.normalize
, вы также можете передать произвольную функцию через именованный аргумент chartransform
(сопоставив кодовые позиции Integer
с кодовыми позициями) для выполнения пользовательских нормализаций, например Unicode.julia_chartransform
.
Совместимость: Julia 1.8
Функция |
Примеры
Например, строку "noël"
в Юникоде можно построить двумя канонически эквивалентными способами в зависимости от того, формируется ли "ë"
из одной кодовой позиции U+00EB или из символа ASCII , за которым следует комбинируемый символ тремы 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.normalize
— Function
Unicode.normalize(s::AbstractString; keywords...)
Unicode.normalize(s::AbstractString, normalform::Symbol)
Нормализует строку s
. По умолчанию каноническая компоновка (compose=true
) выполняется без обеспечения стабильности версий Юникода (compat=false
), что позволяет получить максимально короткую эквивалентную строку, но может привести к появлению символов компоновки, отсутствующих в более ранних версиях Юникода.
В качестве альтернативы можно указать одну из четырех «нормальных форм» стандарта Юникода: 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
: выполнять выравнивание регистра символов Юникода, например для нечувствительного к регистру сравнения строк -
newline2lf=true
,newline2ls=true
илиnewline2ps=true
: преобразовывать различные последовательности новой строки (LF, CRLF, CR, NEL) в символ перевода строки (LF), разделения строки (LS) или разделения абзаца (PS) соответственно -
stripmark=true
: удалять диакритические знаки (например, акценты) -
stripignore=true
: удалять игнорируемые по умолчанию символы Юникода (например, мягкий дефис или метку слева направо) -
stripcc=true
: удалять управляющие символы; символы горизонтальной табуляции и символы перевода страницы преобразуются в пробелы; символы перевода строки также преобразуются в пробелы, если не был указан флаг преобразования перевода строки -
rejectna=true
: выдавать ошибку при обнаружении неприсвоенных кодов символов -
stable=true
: обеспечивать стабильность управления версиями Юникода (никогда не вводить символы, отсутствующие в более ранних версиях Юникода)
Вы также можете использовать ключевое слово 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: Юникод U+00e9, RHS: U+0065 & U+0301
true
julia> "μ" == Unicode.normalize("µ", compat=true) #LHS: Юникод U+03bc, RHS: Юникод U+00b5
true
julia> Unicode.normalize("JuLiA", casefold=true)
"julia"
julia> Unicode.normalize("JúLiA", stripmark=true)
"JuLiA"
Совместимость: Julia 1.8
Для именованного аргумента |
#
Unicode.graphemes
— Function
graphemes(s::AbstractString) -> GraphemeIterator
Возвращает итератор по подстрокам в s
, которые соответствуют расширенным графемам в строке, как определено в стандарте Юникода 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é"
, потому что графема "é"
на самом деле представлена двумя кодовыми позициями Юникода ( и символом комбинирования со знаком акута U+0301).
Так как для нахождения границ графем требуется перебор содержимого строки, время выполнения функции graphemes(s, m:n)
пропорционально длине строки (количеству кодовых позиций) до конца подстроки.
Совместимость: Julia 1.9
Для аргумента |