Unicode
Unicode.julia_chartransform
— 函数Unicode.julia_chartransform(c::Union{Char,Integer})
根据 Julia 解析器使用的自定义等价性(除了 NFC 规范化),将 Unicode 字符 (Char
) 或码点 (Integer
) c
映射到相应的“等效”字符或码点。
例如,'µ'
(U+00B5 微)在 Julia 的解析器中被视为等效于 'μ'
(U+03BC 微),因此 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 中引入。
Unicode.isassigned
— 函数Unicode.isassigned(c) -> Bool
如果给定的字符或整数是分配的 Unicode 码点,则返回 true
。
示例
julia> Unicode.isassigned(101)
true
julia> Unicode.isassigned('\x01')
true
Unicode.isequal_normalized
— 函数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
。
isequal_normalized
函数是在 Julia 1.8 中添加的。
示例
例如,字符串 "noël"
可以通过两种规范等效的方式在 Unicode 中构造,具体取决于 "ë"
是由单个码点 U+00EB 构成还是由 ASCII 字符 'e'
后跟 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
— 函数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...)
来获得更精细的控制和额外的转换,其中指定了以下任意数量的布尔关键字选项(除了 compose
外,所有这些选项都默认为 false
):
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"
chartransform
关键字参数需要 Julia 1.8。
Unicode.graphemes
— 函数graphemes(s::AbstractString) -> GraphemeIterator
返回 s
的子字符串的迭代器,这些子字符串对应于字符串中扩展的 graphemes,如 Unicode UAX #29 所定义。(大体上,这些是用户认为是单个字符的内容,即使它们可能包含多个码点;例如,字母与重音符号组合是一个 grapheme。)
graphemes(s::AbstractString, m:n) -> SubString
返回 s
的 SubString
,它由字符串 s
中的第 m
个到第 n
个 graphemes 组成,其中第二个参数 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)
这包括 "exposé"
中的第 3 个到第7个码点 (Char
),因为 grapheme "é"
实际上是两个 Unicode 码点(一个 'e'
后跟一个锐音组合字符 U+0301)。
由于查找 grapheme 边界需要迭代字符串内容,因此 graphemes(s, m:n)
函数需要与子字符串结束前的字符串长度(码点数)成正比的时间。
graphemes
的 m:n
参数需要 Julia 1.9。