`

Python、Unicode和中文

阅读更多

Python、Unicode和中文

python的中文问题一直是困扰新手的头疼问题,这篇文章将给你详细地讲解一下这方面的知识。当然,几乎可以确定的是,在将来的版本中,python会彻底解决此问题,不用我们这么麻烦了。

先来看看python的版本:
>>> import sys
>>> sys.version
'2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)]'

(一)
用记事本创建一个文件ChineseTest.py,默认ANSI:
s = "中文"
print s

测试一下瞧瞧:
E:\Project\Python\Test>python ChineseTest.py
File "ChineseTest.py", line 1
SyntaxError: Non-ASCII character '\xd6' in file ChineseTest.py on line 1, but no encoding declared; see http://www.pytho
n.org/peps/pep-0263.html for details

偷偷地把文件编码改成UTF-8:
E:\Project\Python\Test>python ChineseTest.py
File "ChineseTest.py", line 1
SyntaxError: Non-ASCII character '\xe4' in file ChineseTest.py on line 1, but no encoding declared; see http://www.pytho
n.org/peps/pep-0263.html for details

无济于事。。。
既然它提供了网址,那就看看吧。简单地浏览一下,终于知道如果文件里有非ASCII字符,需要在第一行或第二行指定编码声明。把ChineseTest.py文件的编码重新改为ANSI,并加上编码声明:
# coding=gbk
s = "中文"
print s

再试一下:
E:\Project\Python\Test>python ChineseTest.py
中文

正常咯:)
(二)
看一看它的长度:
# coding=gbk
s = "中文"
print len(s)
结果:4。
s这里是str类型,所以计算的时候一个中文相当于两个英文字符,因此长度为4。
我们这样写:
# coding=gbk
s = "中文"
s1 = u"中文"
s2 = unicode(s, "gbk") #省略参数将用python默认的ASCII来解码
s3 = s.decode("gbk") #把str转换成unicode是decode,unicode函数作用与之相同
print len(s1)
print len(s2)
print len(s3)
结果:
2
2
2
(三)
接着来看看文件的处理:
建立一个文件test.txt,文件格式用ANSI,内容为:
abc中文
用python来读取
# coding=gbk
print open("Test.txt").read()
结果:abc中文
把文件格式改成UTF-8:
结果:abc涓枃
显然,这里需要解码:
# coding=gbk
import codecs
print open("Test.txt").read().decode("utf-8")
结果:abc中文
上面的test.txt我是用Editplus来编辑的,但当我用Windows自带的记事本编辑并存成UTF-8格式时,
运行时报错:
Traceback (most recent call last):
File "ChineseTest.py", line 3, in <module>
print open("Test.txt").read().decode("utf-8")
UnicodeEncodeError: 'gbk' codec can't encode character u'\ufeff' in position 0: illegal multibyte sequence

原来,某些软件,如notepad,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
因此我们在读取时需要自己去掉这些字符,python中的codecs module定义了这个常量:
# coding=gbk
import codecs
data = open("Test.txt").read()
if data[:3] == codecs.BOM_UTF8:
data = data[3:]
print data.decode("utf-8")
结果:abc中文

(四)一点遗留问题
在第二部分中,我们用unicode函数和decode方法把str转换成unicode。为什么这两个函数的参数用"gbk"呢?
第一反应是我们的编码声明里用了gbk(# coding=gbk),但真是这样?
修改一下源文件:
# coding=utf-8
s = "中文"
print unicode(s, "utf-8")
运行,报错:
Traceback (most recent call last):
File "ChineseTest.py", line 3, in <module>
s = unicode(s, "utf-8")
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-1: invalid data
显然,如果前面正常是因为两边都使用了gbk,那么这里我保持了两边utf-8一致,也应该正常,不至于报错。
更进一步的例子,如果我们这里转换仍然用gbk:
# coding=utf-8
s = "中文"
print unicode(s, "gbk")
结果:中文
翻阅了一篇英文资料,它大致讲解了python中的print原理:
When Python executes a print statement, it simply passes the output to the operating system (using fwrite() or something like it), and some other program is responsible for actually displaying that output on the screen. For example, on Windows, it might be the Windows console subsystem that displays the result. Or if you're using Windows and running Python on a Unix box somewhere else, your Windows SSH client is actually responsible for displaying the data. If you are running Python in an xterm on Unix, then xterm and your X server handle the display.

To print data reliably, you must know the encoding that this display program expects.

简单地说,python中的print直接把字符串传递给操作系统,所以你需要把str解码成与操作系统一致的格式。Windows使用CP936(几乎与gbk相同),所以这里可以使用gbk。
最后测试:
# coding=utf-8
s = "中文"
print unicode(s, "cp936")
结果:中文
分享到:
评论

相关推荐

    python判断unicode是否是汉字,数字,英文,或者其他字符.docx

    python判断unicode是否是汉字,数字,英文,或者其他字符.docx

    利用python3随机生成中文字符的实现方法

    在unicode码中,汉字的范围是(0x4E00, 9FBF) import random def Unicode(): val = random.randint(0x4e00, 0x9fbf) return chr(val) 这个方法比较简单,但是有个小问题,unicode码中收录了2万多个汉字,包含很多生僻...

    python实现unicode转中文及转换默认编码的方法

    主要介绍了python实现unicode转中文及转换默认编码的方法,结合实例形式分析了Python针对Unicode编码操作的相关技巧及编码转换中的常见问题解决方法,需要的朋友可以参考下

    python3 unicode列表转换为中文的实例

    今天小编就为大家分享一篇python3 unicode列表转换为中文的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    python将unicode转为str的方法

    问题:  将u’\u810f\u4e71’转换为’\u810f\u4e71′  方法:  s_unicode = u'\u810f\u4e71' ... 您可能感兴趣的文章:python文字和unicode/ascll相互转换函数及简单加密解密实现代码python2 中 uni

    Unicode汉字编码表.doc

    国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换。兼容GBK和GB2312字符集。

    Python 如何将爬取的Unicode码转换为中文信息 Python源码

    Python 如何将爬取的Unicode码转换为中文信息 Python源码Python 如何将爬取的Unicode码转换为中文信息 Python源码Python 如何将爬取的Unicode码转换为中文信息 Python源码Python 如何将爬取的Unicode码转换为中文...

    Unicode和Python的中文处理

    在Python语言中,Uincode字符串处理一直是一个容易让人迷惑的问题。许多Python爱好者经常因为搞不清Unicode、UTF-8还有其它许许多多的编码...本文将介绍Unicode和Python的中文处理的相关知识。下面跟着小编一起来看下吧

    Python3的unicode编码转换成中文的问题及解决方案

    主要介绍了Python3的unicode编码转换成中文的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Python中文全攻略

    在 Python 中有两种默认的字符串:str 和unicode。在Python 中一定要注意区分“Unicode 字符 串”和“unicode 对象”的区别。后面所有的“unicode 字符串”指的都是python 里的“unicode 对象”。 事实上在Python 中...

    基于ESP32和python语言写的OLED屏字符显示和绘图

    因为制作了Unicode编码字库存放于ESP32模块中,所以可以显示Unicode编码中文汉字和ASCII码的任意字符。由于ESP32体积有限所以只截取了Unicode编码字库中的中文汉字和ASCII码的字库,字库体积从原来的2048KB裁剪到了...

    Python学习手册中文版

    如果你想动手编写高效、高质量并且很容易与其他语言和工具集成的代码,本书将快速地帮助你利用Python提高效率。本书基于Python专家的流程培训课程...探索先进的Python工具,包括装饰符、描述符、元类、Unicode的处理。

    Python学习手册4th Edition(Learning Python中文扫描版)

    《Python学习手册:第4版》是《Learning Python》的高清中文扫描版,是易于掌握和自学的教程,根据作者Python专家Mark Lutz的著名培训课程编写而成。 《Python学习手册:第4版》包括以下内容: 学习Python的主要内建...

    python将unicode和str互相转化的实现

    问题一: 将u’\u810f\u4e71’转换为’\u810f\u4e71′ 方法: s_unicode = u’\u810f\u4e71′ s_str = s_unicode.encode(...补充知识:Python最简单的解决列表中只打印UNICODE而不是中文字符的方法 答案就是用js

    Python中文本编码官方文件(howto-unicode)

    Python官方解答unicode编码基本知识以及常见问题的处理。对于深入理解Unicode编码十分重要。

    Python 编码处理-str与Unicode的区别

    一篇关于STR和UNICODE的好文章 整理下python编码相关的内容 注意: 以下讨论为Python2.x版本, Py3k的待尝试 开始 用python处理中文时,读取文件或消息,http参数等等 一运行,发现乱码(字符串处理,读写文件,print) ...

    20180530_Python编码及中文乱码1

    ·我们的Python3默认就是Unicode编码编码与解码·Python关于编码和解码对应的函数分别是encode()和decode(),对应编码和解码·pyt

    python避免中文乱码的代码.docx

    python避免中文乱码的代码全文共4页,当前为第1页。python避免中文乱码的代码全文共4页,当前为第1页。...普通字符串使用ASCII码表示,而Unicode字符串python避免中文乱码的代码全文共4页,当前为第2页。python避免中文

Global site tag (gtag.js) - Google Analytics