今天在写代码的时候遇上了中文编码报错的问题,ASCII和Unicode转化的问题,报错如下:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
每次遇上中文都感觉头大,这次由于需要使用中文来作为键值所以必须解决好这个问题,同样的汉字使用utf-8编码之后变为:
如:武汉------>u'\u6b66\u6c49'
可是做键的时候就变成了:'\xe6\xad\xa6\xe6\xb1\x89'
实在是不知道怎么回事,后来找到了解决办法就是使用字符串编码检测方法找到字符串的编码方式,然后使用该编码方式来编码即可,具体实现如下:
#!usr/bin/env python
#encoding:utf-8
'''
__Author__:沂水寒城
功能:中文编码问题
'''
import xlrd
import chardet
def create_huoche_station_dict(data='china_station_names.xls'):
'''
创建:站名--字母简称字典
'''
station_name_dict={}
content=xlrd.open_workbook(data)
table=content.sheets()[0]
nrows=table.nrows #行数
ncols=table.ncols #列数
for i in range(1,nrows):
row=table.row_values(i)
if row:
station_name_dict[row[1]]=row[-1]
return station_name_dict
if __name__ == '__main__':
station_name_dict=create_huoche_station_dict(data='data/xidu/china_station_names.xls')
station_list=["武汉","青岛北","北京西","菏泽","郑州东","哈尔滨西","重庆北","广州东","大同","新乡","拉萨","上海","兰州",
"桂林","洛阳","泰安","威海","烟台","济南西","沈阳北","长春","长沙","福州","偃师","成都"]
for one in station_list:
JX=station_name_dict[unicode(one,chardet.detect(one)['encoding'])]
print '{0}车站简写为:{1}'.format(one,JX)
结果如下:
武汉车站简写为:WHA
青岛北车站简写为:QDB
北京西车站简写为:BJX
菏泽车站简写为:HZE
郑州东车站简写为:ZZD
哈尔滨西车站简写为:HEX
重庆北车站简写为:CQB
广州东车站简写为:GZD
大同车站简写为:DTO
新乡车站简写为:XXI
拉萨车站简写为:LSA
上海车站简写为:SHA
兰州车站简写为:LZH
桂林车站简写为:GLI
洛阳车站简写为:LYA
泰安车站简写为:TAN
威海车站简写为:WHA
烟台车站简写为:YTA
济南西车站简写为:JNX
沈阳北车站简写为:SYB
长春车站简写为:CCH
长沙车站简写为:CSH
福州车站简写为:FZH
偃师车站简写为:YSH
成都车站简写为:CDU
[Finished in 0.5s]