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

此函数在 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)

返回 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
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=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。

Unicode.graphemes函数
graphemes(s::AbstractString) -> GraphemeIterator

返回 s 的子字符串的迭代器,这些子字符串对应于字符串中扩展的 graphemes,如 Unicode UAX #29 所定义。(大体上,这些是用户认为是单个字符的内容,即使它们可能包含多个码点;例如,字母与重音符号组合是一个 grapheme。)

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

返回 sSubString,它由字符串 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) 函数需要与子字符串结束前的字符串长度(码点数)成正比的时间。

Julia 1.9

graphemesm:n 参数需要 Julia 1.9。