字形

Julia 的 Char 类型表示 Unicode 标量值 ,仅在某些情况下对应于人类认为的角色。例如,字符é的一个表示(如简历中)实际上是两个 Unicode 标量值的组合:

julia> collect("é")
2-element Array{Char,1}:
 'e'
 '́'

这些代码点的 Unicode 描述是 LATIN SMALL LETTER ECOMBINING 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