考虑以下分析三字节 UTF-8 字符串的 Ruby 代码:
#encoding: utf-8
s = "\x65\xCC\x81"
p [s.bytesize, s.length, s, s.encoding.name]
#=> [3, 2, "é", "UTF-8"]
如所述on this page of mine上面确实是两个字符的字符串:拉丁小写字母 e
后跟 Combining Acute Accent .但是,它看起来 像一个字符,这在布置固定宽度的显示器时很重要。
例如,在 this directory listing 上查看“moiré.svg”的两个条目并注意其中一个是如何弄乱列对齐的。
如何计算 Ruby 中不包含任何零宽度组合字符的字符串的“等宽视觉长度”? (一种有效的技术可能是一种将 Unicode 字符串转换为其规范表示的方法,将上面的内容转换为 "\xC3\xA9"
,它也看起来像 é
但有一个长度
为1
。)
最佳答案
unicode_utils gem 可能有帮助
有一个char_display_width
方法:
require "unicode_utils/char_display_width"
UnicodeUtils.char_display_width("別") # => 2
UnicodeUtils.char_display_width(0x308) # => 0
UnicodeUtils.char_display_width("a") # => 1
有一个字符串display_width
方法:
require "unicode_utils/display_width"
UnicodeUtils.display_width("別れ") => 4
UnicodeUtils.display_width("12") => 2
UnicodeUtils.display_width("a\u{308}") => 1
另请参阅 each_grapheme
.
(感谢 Michael Anderson 指出额外的方法)
关于ruby - 在没有组合标记的情况下计算 Unicode 字符串长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10021591/