Unicode
Unicode
模块提供了管理 Unicode 字符和字符串的基本功能。它包括验证、类别确定、规范化、大小写转换和字素分段,使有效的 Unicode 数据处理成为可能。
Unicode
— ModuleUnicode
模块提供了管理 Unicode 字符和字符串的基本功能。它包括验证、类别确定、规范化、大小写转换和字素分割,使得有效的 Unicode 数据处理成为可能。
Unicode.julia_chartransform
— FunctionUnicode.julia_chartransform(c::Union{Char,Integer})
将Unicode字符(Char
)或代码点(Integer
)c
映射到相应的“等效”字符或代码点,具体取决于Julia解析器中使用的自定义等价(除了NFC规范化之外)。
例如,'µ'
(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
— FunctionUnicode.isassigned(c) -> Bool
如果给定的字符或整数是已分配的 Unicode 代码点,则返回 true
。
示例
julia> Unicode.isassigned(101)
true
julia> Unicode.isassigned('\x01')
true
Unicode.isequal_normalized
— Functionisequal_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
— FunctionUnicode.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
— Functiongraphemes(s::AbstractString) -> GraphemeIterator
返回一个迭代器,该迭代器遍历字符串 s
中对应于扩展字形的子字符串,按照 Unicode UAX #29 的定义。(大致来说,这些是用户所感知的单个字符,即使它们可能包含多个代码点;例如,一个字母与一个重音符号组合在一起是一个单一的字形。)
graphemes(s::AbstractString, m:n) -> SubString
返回一个 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
s) 组成,因为 grapheme "é"
实际上是 两个 Unicode 代码点(一个 'e'
后跟一个重音符号组合字符 U+0301)。
由于查找 grapheme 边界需要遍历字符串内容,因此 graphemes(s, m:n)
函数所需的时间与字符串的长度(代码点数量)成正比,直到子字符串的末尾。
graphemes
的 m:n
参数需要 Julia 1.9。