`
ryan.liu
  • 浏览: 136700 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

GB2312中文转拼音

 
阅读更多

#-*- coding: utf-8 -*-

from bisect import bisect


FIRST_LETTERS = ["a", "b", "c", "d", "e", "f", "g", "h", "j", "k", "l", "m", "n",
          "o", "p", "q", "r", "s", "t", "w", "x", "y", "z"]
FIRST_NUMBERS = [1, 37, 233, 478, 674, 702, 833, 994, 1187, 1506, 1612, 1872,
            2035, 2122, 2130, 2258, 2427, 2486, 2790, 2958, 3084, 3325, 3649]
PINYIN_LETTERS = [
    ['a', 'ai', 'an', 'ang', 'ao'],
    ['ba', 'bai', 'ban', 'bang', 'bao', 'bei', 'ben', 'beng', 'bi', 'bian', 'biao', 'bie', 'bin', 'bing', 'bo', 'bu'],
    ['ca', 'cai', 'can', 'cang', 'cao', 'ce', 'ceng', 'cha', 'chai', 'chan', 'chang', 'chao', 'che', 'chen', 'cheng', 'chi', 'chong', 'chou', 'chu', 'chuan', 'chuang', 'chui', 'chun', 'chuo', 'ci', 'cong', 'cou', 'cu', 'cuan', 'cui', 'cun', 'cuo'],
    ['da', 'dai', 'dan', 'dang', 'dao', 'de', 'deng', 'di', 'dian', 'diao', 'die', 'ding', 'diu', 'dong', 'dou', 'du', 'duan', 'dui', 'dun', 'duo'],
    ['e', 'en', 'er'],
    ['fa', 'fan', 'fang', 'fei', 'fen', 'feng', 'fo', 'fou', 'fu'],
    ['ga', 'gai', 'gan', 'gang', 'gao', 'ge', 'gei', 'gen', 'geng', 'gong', 'gou', 'gu', 'gua', 'guai', 'guan', 'guang', 'gui', 'gun', 'guo'],
    ['ha', 'hai', 'han', 'hang', 'hao', 'he', 'hei', 'hen', 'heng', 'hong', 'hou', 'hu', 'hua', 'huai', 'huan', 'huang', 'hui', 'hun', 'huo'],
    ['ji', 'jia', 'jian', 'jiang', 'jiao', 'jie', 'jin', 'jing', 'jiong', 'jiu', 'ju', 'juan', 'jue', 'jun'],
    ['ka', 'kai', 'kan', 'kang', 'kao', 'ke', 'ken', 'keng', 'kong', 'kou', 'ku', 'kua', 'kuai', 'kuan', 'kuang', 'kui', 'kun', 'kuo'],
    ['la', 'lai', 'lan', 'lang', 'lao', 'le', 'lei', 'leng', 'li', 'lia', 'lian', 'liang', 'liao', 'lie', 'lin', 'ling', 'liu', 'long', 'lou', 'lu', 'lv', 'lue', 'lv', 'lu', 'luan', 'lue', 'lun', 'luo'],
    ['ma', 'mai', 'man', 'mang', 'mao', 'me', 'mei', 'men', 'meng', 'mi', 'mian', 'miao', 'mie', 'min', 'ming', 'miu', 'mo', 'mou', 'mu'],
    ['na', 'nai', 'nan', 'nang', 'nao', 'ne', 'nei', 'nen', 'neng', 'ni', 'nian', 'niang', 'niao', 'nie', 'nin', 'ning', 'niu', 'nong', 'nu', 'nv', 'nuan', 'nue', 'nuo'],
    ['o', 'ou'],
    ['pa', 'pai', 'pan', 'pang', 'pao', 'pei', 'pen', 'peng', 'pi', 'pian', 'piao', 'pie', 'pin', 'ping', 'po', 'pou', 'pu'],
    ['qi', 'qia', 'qian', 'qiang', 'qiao', 'qie', 'qin', 'qing', 'qiong', 'qiu', 'qu', 'quan', 'que', 'qun'],
    ['ran', 'rang', 'rao', 're', 'ren', 'reng', 'ri', 'rong', 'rou', 'ru', 'ruan', 'rui', 'run', 'ruo'],
    ['sa', 'sai', 'san', 'sang', 'sao', 'se', 'sen', 'seng', 'sha', 'shai', 'shan', 'shang', 'shao', 'she', 'shen', 'sheng', 'shi', 'shou', 'shu', 'shua', 'shuai', 'shuan', 'shuang', 'shui', 'shun', 'shuo', 'si', 'song', 'sou', 'su', 'suan', 'sui', 'sun', 'suo'],
    ['ta', 'tai', 'tan', 'tang', 'tao', 'te', 'teng', 'ti', 'tian', 'tiao', 'tie', 'ting', 'tong', 'tou', 'tu', 'tuan', 'tui', 'tun', 'tuo'],
    ['wa', 'wai', 'wan', 'wang', 'wei', 'wen', 'weng', 'wo', 'wu'],
    ['xi', 'xia', 'xian', 'xiang', 'xiao', 'xie', 'xin', 'xing', 'xiong', 'xiu', 'xu', 'xuan', 'xue', 'xun'],
    ['ya', 'yan', 'yang', 'yao', 'ye', 'yi', 'yin', 'ying', 'yo', 'yong', 'you', 'yu', 'yuan', 'yue', 'yun'],
    ['za', 'zai', 'zan', 'zang', 'zao', 'ze', 'zeng', 'zha', 'zhai', 'zhan', 'zhang', 'zhao', 'zhe', 'zhen', 'zheng', 'zhi', 'zhong', 'zhou', 'zhu', 'zhua', 'zhuai', 'zhuan', 'zhuang', 'zhui', 'zhun', 'zhuo', 'zi', 'zong', 'zou', 'zu', 'zuan', 'zui', 'zun', 'zuo']
]
PINYIN_NUMBERS = [
    [2, 3, 16, 25, 28],
    [37, 55, 63, 78, 90, 113, 128, 132, 138, 162, 174, 178, 182, 188, 203, 222],
    [233, 234, 245, 252, 257, 262, 267, 269, 280, 283, 293, 312, 321, 327, 337, 352, 368, 373, 385, 408, 415, 421, 426, 433, 435, 447, 453, 454, 458, 461, 469, 472],
    [478, 484, 502, 517, 522, 534, 537, 544, 563, 579, 588, 601, 610, 611, 621, 629, 643, 649, 653, 662],
    [674, 687, 688],
    [702, 710, 727, 738, 750, 765, 780, 781, 782],
    [833, 835, 841, 852, 861, 871, 888, 889, 891, 904, 919, 928, 946, 952, 955, 966, 969, 985, 988],
    [994, 1001, 1008, 1027, 1030, 1039, 1057, 1059, 1063, 1068, 1077, 1084, 1108, 1117, 1122, 1136, 1150, 1171, 1177],
    [1187, 1246, 1263, 1309, 1322, 1350, 1377, 1403, 1428, 1430, 1447, 1472, 1479, 1489],
    [1506, 1510, 1515, 1521, 1528, 1532, 1547, 1551, 1553, 1557, 1561, 1568, 1573, 1577, 1579, 1587, 1604, 1608],
    [1612, 1619, 1622, 1637, 1644, 1653, 1655, 1666, 1669, 1709, 1710, 1724, 1735, 1748, 1753, 1765, 1779, 1790, 1805, 1811, 1831, 1842, 1843, 1844, 1845, 1851, 1853, 1860],
    [1872, 1881, 1887, 1902, 1908, 1920, 1921, 1937, 1940, 1948, 1962, 1971, 1979, 1981, 1987, 1993, 1994, 2017, 2020],
    [2035, 2042, 2047, 2050, 2051, 2056, 2057, 2059, 2060, 2061, 2072, 2080, 2081, 2083, 2090, 2091, 2103, 2107, 2111, 2114, 2115, 2116, 2119],
    [2122, 2123],
    [2130, 2136, 2142, 2150, 2155, 2162, 2171, 2173, 2187, 2210, 2214, 2218, 2220, 2225, 2234, 2243, 2244],
    [2258, 2294, 2303, 2325, 2333, 2348, 2353, 2364, 2377, 2379, 2387, 2407, 2417, 2425],
    [2427, 2431, 2436, 2439, 2441, 2451, 2453, 2454, 2464, 2467, 2477, 2479, 2482, 2484],
    [2486, 2489, 2493, 2503, 2506, 2510, 2513, 2514, 2515, 2524, 2526, 2542, 2550, 2561, 2573, 2589, 2606, 2653, 2663, 2702, 2704, 2708, 2710, 2713, 2717, 2721, 2725, 2741, 2749, 2753, 2765, 2768, 2779, 2782],
    [2790, 2805, 2814, 2832, 2845, 2856, 2857, 2861, 2876, 2884, 2889, 2892, 2908, 2921, 2925, 2936, 2938, 2944, 2947],
    [2958, 2965, 2967, 2984, 2994, 3033, 3043, 3046, 3055],
    [3084, 3125, 3138, 3164, 3184, 3208, 3229, 3239, 3254, 3261, 3270, 3289, 3305, 3311],
    [3325, 3341, 3374, 3391, 3412, 3427, 3480, 3502, 3520, 3521, 3536, 3556, 3607, 3627, 3637],
    [3649, 3652, 3659, 3663, 3666, 3680, 3686, 3690, 3710, 3716, 3733, 3748, 3758, 3768, 3784, 3805, 3848, 3859, 3873, 3905, 3907, 3908, 3914, 3921, 3927, 3929, 3940, 3955, 3962, 3966, 3974, 3976, 3980, 3982]
]


def gb2312_pinyin(unichar, first_letter=False):
    assert(isinstance(unichar, unicode))
    gbkchar = unichar.encode("GBK")
    high_code = ord(gbkchar[0]) - 160  #GBK区码
    low_code = ord(gbkchar[1]) - 160   #GBK位码
    char_code = (high_code - 16) * 100 + low_code
    if -1299 <= char_code <= -1206:
        return chr(char_code + 1332) #全角转半角
    elif char_code < 1 or char_code > 3989:
        return "" #不是汉字,或者未被GB2312收录的生僻字

    idx = bisect(FIRST_NUMBERS, char_code)
    if first_letter: #找首字母
        result = FIRST_LETTERS[idx - 1]
    else: #完整拼音
        inidx = bisect(PINYIN_NUMBERS[idx - 1], char_code)
        result = PINYIN_LETTERS[idx - 1][inidx - 1]
    return result


def to_unicode(word):
    if not isinstance(word, unicode):
        try: #尝试当作UTF-8编码转为UNICODE
            word = unicode(word, "UTF-8")
        except UnicodeDecodeError:
            try: #尝试当作GBK编码转为UNICODE
                word = unicode(word, "GBK")
            except UnicodeDecodeError:
                word = ""
    return word


def split_sentence(sentence):
    """ 将中英文混合的句子分割成单个汉字和连续英文 """
    word = ""
    for character in sentence:
        if ord(character) <= 255: #ASCII
            word += character
        else:
            yield True, word
            word = ""
            yield False, character
    yield True, word


def words_to_pinyin(words, first_letter=False, seperator=""):
    uniwords = to_unicode(words)
    letters = []
    for is_ascii, word in split_sentence(uniwords):
        if word:
            if not is_ascii:
                word = gb2312_pinyin(word, first_letter)
            letters.append(word)
    return seperator.join(letters)


def words_pinyin_for_sort(words, first_letter=False):
    uniwords = to_unicode(words)
    word_pinyin = words_to_pinyin(uniwords, first_letter, seperator="~")
    if len(uniwords) > 0 and ord(uniwords[0]) > 255:
        word_pinyin = "~" + word_pinyin
    return word_pinyin


if "__main__"==__name__:
    print words_to_pinyin("好V5的中文", first_letter=True)
    print words_to_pinyin("好V5的中文!", seperator=" ")
    print words_pinyin_for_sort("好V5的中文!")
 
分享到:
评论

相关推荐

    汉字转全拼音或拼音首字母,支持gb2312和utf8编码

    汉字转全拼音或拼音首字母,支持gb2312和utf8编码 ,附带函数说明, 汉字转换为全拼音或拼音首字母 使用方法: include(ROOT_PATH.'includes/cls_chart_pinyin.php'); echo Pinyin('中国人','utf-8',false); 函数...

    gb2312汉字拼音对照表

    《GB2312汉字拼音对照表》是一个重要的IT资源,尤其对于中文处理和数据库管理领域具有极高价值。GB2312是中国国家标准的一种字符编码,全称为“信息交换用汉字编码字符集基本集”,是早期广泛使用的中文编码标准,为...

    GB2312汉字拼音对照表

    ### GB2312汉字拼音对照表解析 #### 一、引言 GB2312是中国国家标准局于1980年发布的一种用于汉字信息处理的编码标准,旨在为汉字提供一种统一的编码方式。它支持大约7445个简体汉字以及682个符号,并分为两级:一...

    较完整的汉字转拼音(全拼)_gb2312

    较完整的汉字转拼音(全拼)_gb2312 C# - Silver Bullet的日志 - 网易博客.rar....................................................................................

    GB2312汉字拼音对照表(加声调、不要声调|文本、数据库)

    1. GB2312汉字拼音对照表7809字.txt (附加声调) 2. GB2312汉字拼音对照表.txt 3. py.sql (为直接的SQL可以直接入数据库) 其中py.sql格式如下:汉字 拼音 字母 insert into pinyin (hz, py, zm) values ('啊', 'a'...

    GB2312简体中文编码表.pdf

    GB2312编码是中国国家标准简体中文字符编码,全称为《信息交换用汉字编码字符集 基本集》,由中华人民共和国国家标准GB 2312-80定义。它是中国第一个正式的汉字编码标准,主要用于简化字的计算机编码表示,容纳了...

    汉字转拼音首字母(UTF-8支持多音字,GB2312不支持多音字)

    汉字转拼音首字母(UTF-8支持多音字,GB2312不支持多音字),程序hz2py_GB2312_Non-polyphone.cpp在Windows系统下VC 6.0运行通过,程序hz2py_UTF-8_Polyphone.c在Ubuntu的Linux系统下运行通过,前者不支持多音字,后者...

    vb全功能汉字转拼音

    标题“vb全功能汉字转拼音”...总之,VB全功能汉字转拼音程序是一个高效、全面的工具,利用编程技术和汉字拼音数据库,为用户提供便捷的汉字转拼音服务。对于需要处理汉字拼音的用户而言,这是一个值得尝试的解决方案。

    GB2312编码对照表

    GB2312编码,正式名称为《信息交换用汉字编码字符集·基本集》,是中国国家标准局在1981年5月1日发布的第一个针对简体中文的字符编码标准。它别名GB0,是为了解决计算机系统中中文信息处理的问题而设计的编码方案,...

    GB2312.txt

    GB2312-80字符集总共包含了6763个汉字,这些汉字按照偏旁部首和拼音顺序进行了编码。除此之外,还包括了682个图形符号。整个字符集采用双字节编码方式,每个汉字或符号占用两个字节的空间,编码范围为A1A1至FEFE(不...

    实用汉字转拼音

    这个库通常基于国家标准GB2312或GBK,包含常用的一级和二级汉字,以及部分三级汉字。 2. 音节划分:由于汉字的拼音中可能包含声母、韵母和声调,因此在转换过程中,需要正确地将拼音拆分为各个音节。例如,“好”字...

    DELPHI 汉字转换拼音

    - **编码问题**: 函数中对汉字的处理基于双字节的GB2312编码。在现代环境中使用时,可能需要考虑Unicode编码的兼容性问题。 - **效率考量**: 直接使用预置的拼音数据和索引查找,虽然实现了功能,但在处理大量汉字时...

    GB2312汉字编码字符集1

    GB2312编码的问世,为简体中文汉字提供了一套统一的编码方案,利用计算机二进制技术,有效解决了中文字符的输入、存储、交换和显示问题。这不仅促进了中文电脑化,也为后续中文计算机技术的发展奠定了坚实的基础。 ...

    GB2312简体中文编码表(完整版)

    GB2312编码表是一种使用双字节对汉字及其符号进行编码的标准,它的全称是《信息交换用汉字编码字符集 基本集》。GB2312编码涵盖了6763个汉字和682个其它符号,其中包括英文字符和一些特殊符号。该编码由中华人民...

    获取汉字首字母 GB2312编码表中的所有汉字

    总结起来,掌握GB2312编码表和汉字首字母转换技术,对于开发中文信息处理系统至关重要。通过解析编码表、转换拼音并提取首字母,我们可以有效地处理和利用中文数据,提高系统的效率和用户体验。而“获取汉字首字母 ...

    GB2312汉字编码表与其字符数组.zip

    GB2312汉字编码表是中国早期制定的一种汉字编码标准,全称为《信息交换用汉字编码字符集·基本集》,由中华人民共和国国家标准总局于1980年发布,旨在解决中文信息处理的问题。GB2312是中文信息处理领域的里程碑,为...

    中文拼音数据库

    《中文拼音数据库》是一个专为处理中文汉字与拼音关系的数据库资源,主要基于GB2312编码标准。这个数据库包含了7809个汉字,覆盖了日常生活中常见的汉字使用范围。它不仅提供了每个汉字的拼音,还包含了汉字的正确...

    汉字gb2312标准库

    GB2312标准库是汉字编码系统中的一个重要组成部分,主要应用于中国大陆的简体中文字符集。该标准库由国家标准局于1980年发布,全称GB2312-80(《信息处理用汉字编码字符集基本集》),收录了6763个常用汉字以及682个...

    qt跨平台汉字转拼音,可用于安卓ios

    2. **汉字转拼音库**:为了实现汉字到拼音的转换,可能需要引入第三方库,比如开源的pinyin4cpp或基于ICU库的解决方案。在Qt中,可以通过动态链接或者静态编译这些库来使用它们的功能。例如,pinyin4cpp库提供了一种...

Global site tag (gtag.js) - Google Analytics