如何将UTF8组合字符转换为ruby中的单个UTF8字符?

Rob*_*zan 15 ruby utf-8

某些字符,例如Unicode字符'LATIN SMALL LETTER C WITH CARON'可以编码为0xC4 0x8D,但也可以用"LATIN SMALL LETTER C"和"COMBINING CARON"的两个代码点表示,即0x63 0xcc 0x8c.
更多信息:http://www.fileformat.info/info/unicode/char/10d/index.htm

我想知道是否有一个库可以将"拉丁文小写字母C"+"组合卡伦"转换为"拉丁文小写字母C卡通".或者是否有包含这些转换的表格?

dus*_*uff 8

这些转换并不总是存在.U + 0063(c)与U + 030C(组合抑扬符)的组合可以表示为一个单独的字符,例如,但有表示与卡伦(W)小写字母"W"没有预组合字符.

然而,存在可以在可能的情况下执行该组合的库.寻找名为"NFC"的Unicode函数(规范化形式:组合).例如,参见:http://unicode-utils.rubyforge.org/classes/UnicodeUtils.html#M000015


Jas*_*rue 6

通常,您使用Unicode标准化来执行此操作.

使用gem unicode_utils(http://unicode-utils.rubyforge.org/)使用UnicodeUtils.nfkc 可以获得您要求的特定行为; unicode规范化形式kC将使用兼容性分解,然后将字符串转换为组合形式(如果可用)(基本上是您的示例所要求的).(您也可以通过规范化形式c接近您想要的,有时缩写为NFC).

如何在Ruby 1.9上替换Unicode gem?有其他细节.

在Ruby 1.8.7中,您需要执行gem install Unicode,其中有类似的功能可用.

编辑添加:你可能想要从kC而不是仅仅归一化形式C的规范化的主要原因是连字(由于历史/印刷原因而挤压在一起的字符)将首先被分解为单个字符,这有时是可取的如果您正在进行词典排序或搜索).

  • 您假设存在这样的预组合字符.这不是一个好的假设.注意U + 0035 <5>`DIGIT FIVE`后跟U + 0304 <<◌̄>`COMBINING MACRON`在NFC中的渲染时间与NFD相比没有.只有少数遗留代码点具有预组合字符.大多数人没有. (3认同)
  • 不,我说"如果有的话." 没有这样的假设. (3认同)