考虑以下Ruby代码,分析一个由三个字节组成的UTF-8字符串:
#encoding: utf-8
s = "\x65\xCC\x81"
p [s.bytesize, s.length, s, s.encoding.name]
#=> [3, 2, "é", "UTF-8"]
如我这个页面所述,上述内容实际上是由两个字符组成:拉丁小写字母e
后面跟着组合重音符号。然而,它们看起来像一个字符,当显示固定宽度的文本时,这很重要。
例如,在这个目录列表中查看“moire.svg”的两个条目,并注意其中一个已经破坏了列对齐。
我该如何计算Ruby字符串的“等宽可视长度”,而不包括任何零宽组合字符呢?(一种有效的技术可能是将Unicode字符串转换为其规范表示形式,将上述内容转换为"\xC3\xA9"
,它也看起来像é
,但长度为1
。)
[3, 3, "é"]
。 - Ilia Frenkel