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

如何在ruby中将UTF8组合字符转换为单个UTF8字符?,ruby,utf-8,Ruby,Utf 8,某些字符,如Unicode字符“带卡隆的拉丁小写字母C”可以编码为0xC4 0x8D,但也可以用“拉丁小写字母C”和“组合卡隆”的两个代码点表示,即0x63 0xcc 0x8c 更多信息请点击此处: 我想知道是否有一个库可以将“拉丁文小写字母C”+“Combing CARON”转换为“LATIN小写字母C WITH CARON”。或者是否有包含这些转换的表?这些转换并不总是存在。例如,U+0063(c)和U+030C(组合caron)的组合可以表示为单个字符,但没有表示小写字母“w”和caron

某些字符,如Unicode字符“带卡隆的拉丁小写字母C”可以编码为
0xC4 0x8D
,但也可以用“拉丁小写字母C”和“组合卡隆”的两个代码点表示,即
0x63 0xcc 0x8c

更多信息请点击此处:


我想知道是否有一个库可以将“拉丁文小写字母C”+“Combing CARON”转换为“LATIN小写字母C WITH CARON”。或者是否有包含这些转换的表?

这些转换并不总是存在。例如,U+0063(c)和U+030C(组合caron)的组合可以表示为单个字符,但没有表示小写字母“w”和caron(w̌)的预合成字符


尽管如此,仍然存在可以在可能的情况下执行此组合的库。寻找一个名为“NFC”(规范化形式:Composition)的Unicode函数。例如,请参见:

通常,您可以使用Unicode规范化来实现这一点

使用gem unicode_utils()使用unicode deutils.nfkc应该可以获得您想要的特定行为;unicode规范化表单kC将使用兼容性分解,然后将字符串转换为组合表单(如果可用)(基本上就是您的示例所要求的)。(通过规范化表单c,有时缩写为NFC,您也可以接近您想要的内容)

有更多的细节

在Ruby 1.8.7中,您需要执行gem安装Unicode,这有一个类似的可用函数

编辑添加:您可能需要规范化表单kC而不仅仅是规范化表单C的主要原因是连字(由于历史/排版原因而压缩在一起的字符)将首先分解为单个字符,如果您正在进行词典排序或搜索,这有时是可取的。)

字符串编码可以从Ruby 1.9开始使用。UTF-8-MAC是NFD的一种变体。在U+2000和U+2FFF之间,或U+F900和U+FAFF之间,或U+2F800和U+2FAFF之间的代码点不分解。有关详细信息,请参阅。UTF-8-HFS也可以代替UTF-8-MAC使用

# coding: utf-8

s = "\u010D"
s.encode!('UTF-8-MAC', 'UTF-8')
s.force_encoding('UTF-8')

p "\x63\xcc\x8c" == s
p "\u0063" == s[0]
p "\u030C" == s[1]

请不要考虑8位代码单元。只考虑逻辑代码点。您可以使用
unicode\u utils
转换为NFC格式,但这并不是您想要的,因为您想要的是不可能的。您假设存在这样一个预组合字符。这不是一个好的假设。注意U+0035è5›
第五位
后跟U+0304è◌̄›
组合宏指令
在NFC中的渲染时间不比NFD短。只有少数遗留代码点具有预组合字符。大多数人没有。不,我说“如果可以的话。”没有这样的假设。