检测任意字符串的字符集/脚本

时间:2016-07-26 17:49:14

标签: utf-8

我正在努力清理实体(人员,组织等)的“配置文件”数据库,配置文件的一部分是其本机脚本中的个人名称(例如泰语),编码为UTF-8。在之前的数据结构中,我们没有捕获名称的字符集,因此现在我们有更多的记录包含无效值而不是手动审核。

此时我需要做的是,通过脚本,确定任何给定名称所使用的语言/脚本。使用以下示例数据集:

Name: "แผ่นดินต้น"
Script: NULL

Name: "አብርሃም"
Script: NULL

我最终需要

Name: "แผ่นดินต้น"
Script: Thai

Name: "አብርሃም"
Script: Amharic

我不需要翻译名称,只需确定他们所处的脚本。是否有一种既定的技术可以解决这类问题?

2 个答案:

答案 0 :(得分:2)

您可以在Perl中使用charnames来确定给定字符的名称。

use strict;
use warnings;
use charnames '';
use feature 'say';
use utf8;

say charnames::viacode(ord 'Բ');

__END__
ARMENIAN CAPITAL LETTER BEN

这样,您可以将所有字符串拆分为字符,然后为每种类型的字符组构建计数哈希。从中找出组有点棘手,但这是一个开始。一旦你完成了一个字符串,计数最高的组就应该获胜。这样,您就不会有标点符号或数字妨碍。

找到一些已经具有unicode范围名称并且易于查找的内容可能更为明智。我知道CPAN上至少有一个模块可以做到这一点,但我现在找不到它。可以滥用这样的东西来使查找更容易。

答案 1 :(得分:2)

使用herehere所述的unicodedata2 Python模块,您可以检查每个字符的Unicode脚本,如下所示:

#!/usr/bin/env python2
#coding: utf-8

import unicodedata2
import collections

def scripts(name):
    scripts = [unicodedata2.script(char) for char in name]
    scripts = collections.Counter(scripts)
    scripts = scripts.most_common()
    scripts = ', '.join(script for script,_ in scripts)
    return scripts


assert scripts(u'Rob') == 'Latin'
assert scripts(u'Robᵩ') == 'Latin, Greek'
assert scripts(u'Aarón') == 'Latin'
assert scripts(u'แผ่นดินต้น') == 'Thai'
assert scripts(u'አብርሃም') == 'Ethiopic'
相关问题