ruby - 在没有组合标记的情况下计算 Unicode 字符串长度

标签 ruby unicode

考虑以下分析三字节 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/

相关文章:

ruby-on-rails - 通过 Capistrano 任务启动具有/特定队列的多个延迟作业工作人员

hadoop - 处理 pig 中的刺分隔符

java - 如何减少从 Uniscribe ScriptItemize 返回的运行次数

string - 从 lisp 中的八位字节解码单个字符

c# - 在 C# 中,如何检测字符是否为非 ASCII 字符?

python - Python 中 Unicode 字符的显示问题(组合字符、假名字符等)

ruby-on-rails - 在rails中批量上传大文件

用于验证 AAD token 是否正确的 Ruby 代码

ruby - 从/到 JSON API 对象化 Ruby 哈希

ruby - #{...} 结构在 Ruby 中是如何使用的?