找出角色的unicode脚本

时间:2012-03-26 08:25:07

标签: python unicode

给定一个unicode字符,返回script(如“拉丁语”,“韩语”等)的最简单方法是什么? unicodedata似乎没有提供此类功能。

5 个答案:

答案 0 :(得分:18)

我希望之前有人做过,但显然不是,所以这就是我最终的结果。下面的模块(我称之为unicodedata2)扩展unicodedata并提供script_cat(chr),它返回一个unicode char的元组(脚本名称,Caterogy)。例如:

# coding=utf8
import unicodedata2
print unicodedata2.script_cat(u'Ф')  #('Cyrillic', 'L')
print unicodedata2.script_cat(u'の')  #('Hiragana', 'Lo')
print unicodedata2.script_cat(u'★')  #('Common', 'So')

模块:https://gist.github.com/2204527

答案 1 :(得分:5)

在我看来,Python unicodedata模块包含用于访问Unicode数据库中的主文件的工具,但其他文件没有任何内容:“此数据库中的数据基于UnicodeData.txt文件”

脚本信息位于Scripts.txt文件中。它的格式相对简单(在UAX #44中描述)并且不是很大(131千字节),因此您可以考虑在程序中解析它。请注意,在Unicode分类中,有“Common”脚本,其中包含在不同脚本中使用的字符,如标点符号。

答案 2 :(得分:2)

遗憾的是,我知道的唯一方法是使用ord()获取Unicode代码点,然后使用您自己的表(使用http://en.wikipedia.org/wiki/Unicode#Standardized_subsets等)。可以按顺序初步转换为某种正常形式,以便处理单个“书面”字符可以用不同的代码点序列表示的事实(这里的unicodedata模块有帮助)。

答案 3 :(得分:2)

您可以使用ord来检索字符的数值(它适用于长度为1的unicode和字节字符串。)

遗憾的是,下一步将涉及您对范围进行测试。这里的数据可能会有所帮助:http://cldr.unicode.org/index/downloads

答案 4 :(得分:0)

通常,仅检测是否使用了某个脚本就足够了,然后可以将unicodedata.name与前缀匹配一起使用。例如,要找出字母是否为西里尔字母,您可以使用

class CharacterNamePrefixTester(dict):
    def __init__(self, prefix):
        self.prefix = prefix
    def __missing__(self, key):
        self[key] = unicodedata.name(key, '').startswith(self.prefix)
        return self[key]

>>> cyrillic = CharaterNamePrefixTester('CYRILLIC ')
>>> cyrillic['й']
True
>>> cyrillic['a']
False

字典是懒洋洋地建立起来的,但是真实值会被记录下来,这样以后对同一字母的查找会更快。