Python漢字轉拼音
使用字典和轉換程序,將漢字轉換為拼音,配置好之后,可以轉換為漢字拼音首字符和漢字全拼.這個使用一個字典和轉化程序就行.網上有一個署名為caocao的人做了一個python的漢字轉拼音的模塊.
最原始的程序參考這篇文章:將GBK漢字轉化為拼音的Python小程序 . 和這里 ,這個排版好些.文中用到的convert.txt就是字典,但是作者的博客中沒有提供下載.我通過網絡搜索,從其他途徑下載到了整個壓縮包,包括字典和 轉換程序.該程序是基于GBK的, 要把漢字分成高低位來處理,一般人理解不了,我做了點改進就是把字典轉化為utf-8的,因為在django中使用的代碼就是utf-8的. 然后把他的程序也做了改進, 改成處理unicode字符,因為Unicode字符只需要處理一個字符,不用把字符分開成兩半.代碼中,convert1()函數是原來作者提供的,我 給它改了名字.我把我寫的convert替換了原來的函數名, 并且把字典文件改成了utf-8編碼的.所以要簡單些.convert函數提供了
self.has_shengdiao = False self.just_shengmu = False self.spliter = '-'
用來配置參數, has_shengdiao,是漢字轉拼音的時候帶上拼音,just_shengmu ,是僅僅把漢字字串轉為漢字首拼字母串, 為false的時候,轉為全拼字符串.spliter是用來分隔漢字的.為空的時候,不把轉換結果用spliter分開, 默認使用"-"(橫線來連接漢字拼音PINYIN,因為W3C推薦在Url中使用-作為連字符,而不是下劃線_來連接字符串,因為下劃線作為鏈接連接字符 串的時候,url在地址欄中好像斷掉了一樣,_下劃線經常看不到.)
字典文件,此處也提供不了,但是大家可以搜索下載原作的的字典, 然后使用支持utf-8轉換的軟件轉換一下就行了.有需要的也可以和我聯系.我的convert程序見下面。另外字典在這里
漢字轉拼音
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Script Name: convert.py
# Creation Date: 2010-09-21 02:12
# Last Modified: 2011-11-12 18:38:13
# Copyright (c)2011, DDTCMS Project
# Purpose: This file used for DDTCMS Project
# ------------------------------------------------------------
#####################################
# Written by caocao #
# Modified by huyoo353@126.com #
# caocao@eastday.com #
# http://nethermit.yeah.net #
#####################################
# python.
import sys,os
import re
import string
class CConvert:
def __init__(self):
self.has_shengdiao = False
self.just_shengmu = False
self.spliter = '-'
"Load data table"
try:
fp=open(os.path.join(settings.PROJECT_DIR, 'utils', 'convert-utf-8.txt'))
except IOError:
print "Can't load data from convert-utf-8.txt\nPlease make sure this file exists."
sys.exit(1)
else:
self.data=fp.read().decode("utf-8")# decoded data to unicode
fp.close()
def convert1(self, strIn):
"Convert Unicode strIn to PinYin"
length, strOutKey, strOutValue, i=len(strIn), "", "", 0
while i<length:
code1 =ord(strIn[i:i+1])
if code1>=0x4e02 and code1<=0xe863:
strTemp = self.getIndex(strIn[i:i+1])
if not self.has_shengdiao:
strTemp = strTemp[:-1]
strLength = len(strTemp)
if strLength<1:strLength=1
strOutKey += string.center(strIn[i:i+1], strLength)+" "
strOutValue += self.spliter + string.center(strTemp, strLength) + self.spliter
else:#ascii code;
strOutKey+=strIn[i:i+1]+" "
strOutValue+=strIn[i:i+1] + ' '
i+=1
#############################
#txlist = utf8String.split()
#out=convert.convert(utf8String)
#l=[]
#for t in map(convert.convert, txlist):
# l.append(t[0])
#v = '-'.join(l).replace(' ','').replace(u'--','-').strip('-')
#############################
return [strOutValue, strOutKey]
def getIndex(self, strIn):
"Convert single Unicode to PinYin from index"
if strIn==' ':return self.spliter
if set(strIn).issubset("'\"`~!@#$%^&*()=+[]{}\\|;:,.<>/?"):return self.spliter # or return ""
if set(strIn).issubset("-—!##%%&&()*,、。:;?? @@\{{|}}~~‘’“”《》【】++==×¥·… ".decode("utf-8")):return ""
pos=re.search("^"+strIn+"([0-9a-zA-Z]+)", self.data, re.M)
if pos==None:
return strIn
else:
if not self.just_shengmu:
return pos.group(1)
else:
return pos.group(1)[:1]
def convert(self, strIn):
"Convert Unicode strIn to PinYin"
if self.spliter != '-' and self.spliter !='_' and self.spliter != '' and self.spliter != ' ':
self.spliter = '-'
pinyin_list=[]
for c in strIn :
pinyin_list.append(self.getIndex(c))
pinyin=''
for p in pinyin_list:
if p==' ':
pinyin+= self.spliter
continue
if len(p)<2:# only shengmu,just get one char,or number
#if p.isdigit():
# pinyin += p + ' '
#else:
# pinyin += p + ' '
pinyin += p + ' '
else:
if not self.has_shengdiao: p = p[:-1]
pinyin += self.spliter + p + self.spliter
pinyin = pinyin.replace(' ','') \
.replace(self.spliter+self.spliter,self.spliter) \
.strip(self.spliter+' ').replace(self.spliter+self.spliter,self.spliter)
return pinyin