Unicode

Unicode 模块提供了管理 Unicode 字符和字符串的基本功能。它包括验证、类别确定、规范化、大小写转换和字素分段,使有效的 Unicode 数据处理成为可能。

UnicodeModule

Unicode 模块提供了管理 Unicode 字符和字符串的基本功能。它包括验证、类别确定、规范化、大小写转换和字素分割,使得有效的 Unicode 数据处理成为可能。

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

将Unicode字符(Char)或代码点(Integerc映射到相应的“等效”字符或代码点,具体取决于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

此函数在Julia 1.8中引入。

source
Unicode.isassignedFunction
Unicode.isassigned(c) -> Bool

如果给定的字符或整数是已分配的 Unicode 代码点,则返回 true

示例

julia> Unicode.isassigned(101)
true

julia> Unicode.isassigned('\x01')
true
source
Unicode.isequal_normalizedFunction
isequal_normalized(s1::AbstractString, s2::AbstractString; casefold=false, stripmark=false, chartransform=identity)

返回 s1s2 是否是规范等价的 Unicode 字符串。如果 casefold=true,则忽略大小写(执行 Unicode 大小写折叠);如果 stripmark=true,则去除变音符号和其他组合字符。

Unicode.normalize 一样,您还可以通过 chartransform 关键字传递任意函数(将 Integer 代码点映射到代码点)以执行自定义规范化,例如 Unicode.julia_chartransform

Julia 1.8

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
source
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...) 来获得更细粒度的控制和额外的转换,其中可以指定任意数量的以下布尔关键字选项(除 compose 外,所有选项默认为 false):

  • compose=false:不执行规范组合
  • decompose=true:执行规范分解而不是规范组合(如果存在,则忽略 compose=true
  • compat=true:兼容等价物被规范化
  • casefold=true:执行 Unicode 大小写折叠,例如用于不区分大小写的字符串比较
  • newline2lf=truenewline2ls=truenewline2ps=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。

source
Unicode.graphemesFunction
graphemes(s::AbstractString) -> GraphemeIterator

返回一个迭代器,该迭代器遍历字符串 s 中对应于扩展字形的子字符串,按照 Unicode UAX #29 的定义。(大致来说,这些是用户所感知的单个字符,即使它们可能包含多个代码点;例如,一个字母与一个重音符号组合在一起是一个单一的字形。)

source
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 个代码点 (Chars) 组成,因为 grapheme "é" 实际上是 两个 Unicode 代码点(一个 'e' 后跟一个重音符号组合字符 U+0301)。

由于查找 grapheme 边界需要遍历字符串内容,因此 graphemes(s, m:n) 函数所需的时间与字符串的长度(代码点数量)成正比,直到子字符串的末尾。

Julia 1.9

graphemesm:n 参数需要 Julia 1.9。

source