字形
Julia 的 Char
类型表示 Unicode 标量值 ,仅在某些情况下对应于人类认为的角色。例如,字符é的一个表示(如简历中)实际上是两个 Unicode 标量值的组合:
julia> collect("é")
2-element Array{Char,1}:
'e'
'́'
这些代码点的 Unicode 描述是 LATIN SMALL LETTER E
和 COMBINING ACUTE ACCENT
。它们共同定义了一个人字符,这是 Unicode 术语称为字形 。更具体地说,Unicode 附件#29 激发了字形集群的定义,因为:
重要的是要认识到用户认为的字符 - 语言编写系统的基本单元 - 可能不仅仅是单个 Unicode 代码点。相反,该基本单元可以由多个 Unicode 代码点组成。为了避免计算机使用术语字符的歧义,这称为用户感知字符。例如,
G
+ acute-accent 是用户感知的字符:用户将其视为单个字符,但实际上由两个 Unicode 代码点表示。这些用户感知的字符由所谓的字素集群近似,可以通过编程方式确定。
Julia 提供了 graphemes
函数来迭代字符串中的字形集群:
julia> for c in graphemes("résumé")
println(c)
end
r
é
s
u
m
é
请注意,如果我们迭代了 Unicode 标量值,那么打印每个字符在自己的行上的结果会更好:
julia> for c in "résumé"
println(c)
end
r
e
s
u
m
e
通常,在使用用户感知的字符处理字符时,处理字形集群比使用 Unicode 标量值更有用。例如,假设我们想要编写一个函数来计算单个单词的长度。一个天真的解决方案是使用
julia> wordlength(word) = length(word)
wordlength (generic function with 1 method)
我们注意到,当单词包含由多个代码点组成的字形集群时,结果是反直觉的:
julia> wordlength("résumé")
8
当我们使用更正确的定义时,使用 graphemes
函数,我们得到预期的结果:
julia> wordlength(word) = length(graphemes(word))
wordlength (generic function with 1 method)
julia> wordlength("résumé")
6