簡體   English   中英

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

[英]How to replace UTF-8 characters with their character names in Ruby?

我想創建Unicode字符到字符[az]和[0-9]的雙向映射。 我想過使用像@ Curly Bracket這樣的Unicode字符名稱{ 遺憾的是,我找不到所有UTF-8字符的列表,其中的字符描述已准備好在Ruby中訪問。 Wikipedia包含Unicode字符 列表,Unicode Consortium有一個Unicode名稱列表 在我開始為列表編寫解析器之前,我想問:

  • 是否已有一個現有的解決方案/ gem來訪問Ruby中的UTF-8字符名稱?
  • 使用UTF-8字符名稱轉換任意UTF-8字符串的最有效方法是什么?

您可以嘗試使用unicode utils gem

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

對於替代品,請在Ruby工具箱中查找“unicode ..”

unicode gem看起來很有前途

Unicode::decompose(str)

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

根據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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM