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

时间:2011-08-04 05:00:13

标签: 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卡通”。或者是否有包含这些转换的表格?

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:6)

通常,您使用Unicode规范化来执行此操作。

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

How to replace the Unicode gem on Ruby 1.9?还有其他详细信息。

在Ruby 1.8.7中,你需要安装gem install Unicode,因为它有类似的功能。

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

答案 2 :(得分:0)

从Python 1.9开始,可以使用

String#encode。 UTF-8-MAC是NFD的变种。 U + 2000和U + 2FFF之间或U + F900和U + FAFF,或U + 2F800和U + 2FAFF范围内的码点不会被分解。有关详细信息,请参阅https://developer.apple.com/library/mac/qa/qa1173/_index.html。 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]