python Unicode转ascii码的一种方法

缘起

看到这样的数据:Marek Čech、Beniardá怎样变成相对应的ascii码呢

 

解决

import unicodedata
s = u"Marek Čech"   #(u表示是unicode而非 ascii码,不加报错!)
line = unicodedata.normalize('NFKD',s).encode('ascii','ignore')
print line

结果

  Marek Cech

 

python 2.* 中文编码问题

问题要从文字的编码讲起。原本的英文编码只有0~255(28),刚好是8位1个字节。为了使计算机表示各种不同的语言,1个字节是大大不够的,自然要进行扩充。中文的话有GB系列、UTF-8,那么,它们之间是什么关系呢?

 

Unicode是一种编码方案,又称万国码,可见其包含之广。但是具体存储到计算机上,并不用这种编码,而是用自身默认的编码方式,utf-8是互联网上使用的最广的一种Unicode的实现方式。UTF-8或者gbk也可以进行解码(decode)还原为Unicode。

 

在python中Unicode是一类对象,表现为以u打头的,比如u'中文',而string又是一类对象,是在具体编码方式下的实际存在计算机上的字符串。比如utf-8编码下的'中文'和gbk编码下的汉字“中华”,并不相同。例如

 python Unicode转ascii码的一种方法_第1张图片

设计python的几个函数

encode():编码
decode():解码
repr():返回一个可以用来表示对象的可打印的字串

 

默认编码问题

#coding: gbk 

str1 = ''
print repr(str1)

str2 = u''
print repr(str2)
str3 = str2.encode('utf-8')
str4 = str2.encode('gbk')
print repr(str3)
print repr(str4)
str5 = str3.decode('utf-8') 
print repr(str5)

执行程序出现问题

说gbk编码器不能解码。原因是何?看看自己的linux配置,用命令“locale”

python Unicode转ascii码的一种方法_第2张图片

其中,与中文输入关系最密切的就是 LC_CTYPE, LC_CTYPE 规定了系统内有效的字符以及这些字符的分类,诸如什么是大写字母,小写字母,大小写转换,标点符号、可打印字符和其他的字符属性等方面。而locale定义zh_CN中最最重要的一项就是定义了汉字(Class “hanzi”)这一个大类,当然也是用Unicode描述的,这就让中文字符在Linux系统中成为合法的有效字符,而且不论它们是用什么字符集编码的。

简单说:程序中写了个str1 = '汗',默认编码是utf-8,当赋予变量str1的时候,因为此时设定的编码为gbk,驴唇不对马嘴,编码与解码不一致,导致解码错误。

修改如下(左),结果(右)

python Unicode转ascii码的一种方法_第3张图片

 

延伸阅读:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

 

你可能感兴趣的:(python Unicode转ascii码的一种方法)