给定一个unicode字符,返回script(如“拉丁语”,“韩语”等)的最简单方法是什么? unicodedata似乎没有提供此类功能。
答案 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')
答案 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
字典是懒洋洋地建立起来的,但是真实值会被记录下来,这样以后对同一字母的查找会更快。