如何用Ruby中的字符名替换UTF-8字符?

时间:2013-05-20 09:13:24

标签: ruby unicode utf-8

我想创建Unicode字符到字符[a-z]和[0-9]的双向映射。我想过为 {使用像 Left Curly Bracket 这样的Unicode字符名称。遗憾的是,我找不到所有UTF-8字符的列表,其中的字符描述已准备好在Ruby中访问。 Wikipedia contains a list of Unicode characters并且有一个Unicode name list by the Unicode Consortium。在我开始为列表编写解析器之前,我想问:

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

3 个答案:

答案 0 :(得分:2)

您可以尝试unicode utils gem

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

对于替代方案,请在The Ruby Toolbox中查找“unicode ..”

unicode宝石看起来很有希望

Unicode::decompose(str)

答案 1 :(得分:1)

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,也可以直接使用。

答案 2 :(得分:0)

根据the suggestion中的ovhaag使用the 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