2

我想创建 Unicode 字符到字符 [az] 和 [0-9] 的双向映射。我考虑过使用 Unicode 字符名称,例如Left Curly Bracket for {。不幸的是,我找不到所有 UTF-8 字符的列表,它们的字符描述已经准备好在 Ruby 中访问。Wikipedia 包含一个 Unicode 字符列表,并且 Unicode Consortium有一个Unicode 名称列表。在我开始为列表编写解析器之前,我想问:

  • 是否已经有现有的解决方案/gem 可以访问 Ruby 中的 UTF-8 字符名称?
  • 使用 UTF-8 字符名称转换任意 UTF-8 字符串的最有效方法是什么?
4

3 回答 3

2

你可以试试unicode utils gem

require "unicode_utils/char_name"
UnicodeUtils.char_name "ᾀ" => "GREEK SMALL LETTER ALPHA .."

对于替代方案,请在Ruby 工具箱中查找“unicode ..”

unicode gem 看起来也很有前途

Unicode::decompose(str)
于 2013-05-20T10:31:07.050 回答
2

uniscribe gem 可以满足您的要求,并且可以处理当前 Unicode 版本中的数据。在 Ruby 中,您可以像这样使用它:

require "uniscribe/kernel_method"
uniscribe "  "

这将导致以下输出:

1D578 ├─      ├─ MATHEMATICAL BOLD FRAKTUR CAPITAL M
1D58E ├─      ├─ MATHEMATICAL BOLD FRAKTUR SMALL I
1D598 ├─      ├─ MATHEMATICAL BOLD FRAKTUR SMALL S
1D588 ├─      ├─ MATHEMATICAL BOLD FRAKTUR SMALL C
 0020 ├─ ] [        ├─ SPACE
1D580 ├─      ├─ MATHEMATICAL BOLD FRAKTUR CAPITAL U
1D593 ├─      ├─ MATHEMATICAL BOLD FRAKTUR SMALL N
1D58E ├─      ├─ MATHEMATICAL BOLD FRAKTUR SMALL I
1D588 ├─      ├─ MATHEMATICAL BOLD FRAKTUR SMALL C
1D594 ├─      ├─ MATHEMATICAL BOLD FRAKTUR SMALL O
1D589 ├─      ├─ MATHEMATICAL BOLD FRAKTUR SMALL D
1D58A ├─      ├─ MATHEMATICAL BOLD FRAKTUR SMALL E
 0020 ├─ ] [        ├─ SPACE
1D56E ├─      ├─ MATHEMATICAL BOLD FRAKTUR CAPITAL C
1D58D ├─      ├─ MATHEMATICAL BOLD FRAKTUR SMALL H
1D586 ├─      ├─ MATHEMATICAL BOLD FRAKTUR SMALL A
1D597 ├─      ├─ MATHEMATICAL BOLD FRAKTUR SMALL R
1D586 ├─      ├─ MATHEMATICAL BOLD FRAKTUR SMALL A
1D588 ├─      ├─ MATHEMATICAL BOLD FRAKTUR SMALL C
1D599 ├─      ├─ MATHEMATICAL BOLD FRAKTUR SMALL T
1D58A ├─      ├─ MATHEMATICAL BOLD FRAKTUR SMALL E
1D597 ├─      ├─ MATHEMATICAL BOLD FRAKTUR SMALL R
1D598 ├─      ├─ MATHEMATICAL BOLD FRAKTUR SMALL S

在引擎盖下,它使用unicode-nameunicode-sequence_name也可以直接使用。

于 2018-03-15T11:46:41.313 回答
0

根据ovhaag使用Unicode Utils gem的建议,我想出了以下对我有用的解决方案:

require 'unicode_utils'
string       = %Q|Testing «ταБЬℓσ»: 1<2 & 4+1>3, now 20% off!|
mapping      = string.chars.collect {|c| UnicodeUtils.char_name(c).downcase}
name_to_byte = UnicodeUtils::NAME_MAP.invert
bytes        = mapping.collect {|c| name_to_byte[c.upcase]}
new_string   = bytes.pack('U*')
string==new_string
于 2013-05-20T15:48:44.220 回答