Python中使用中文的方法


Posted in Python onFebruary 19, 2011

先来看看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.python.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.python.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

(三)
接着来看看文件的处理:
建立一个文件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 相关文章推荐
Python端口扫描简单程序
Nov 10 Python
Python实现动态加载模块、类、函数的方法分析
Jul 18 Python
python3.0 模拟用户登录,三次错误锁定的实例
Nov 02 Python
python中判断文件编码的chardet(实例讲解)
Dec 21 Python
python获取指定字符串中重复模式最高的字符串方法
Jun 29 Python
对python sklearn one-hot编码详解
Jul 10 Python
python3 拼接字符串的7种方法
Sep 12 Python
python实现归并排序算法
Nov 22 Python
python中metaclass原理与用法详解
Jun 25 Python
使用python实现ftp的文件读写方法
Jul 02 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
Aug 12 Python
python同步windows和linux文件
Aug 29 Python
python实现的防DDoS脚本
Feb 08 #Python
Python牛刀小试密码爆破
Feb 03 #Python
初学python数组的处理代码
Jan 04 #Python
让python json encode datetime类型
Dec 28 #Python
让python的Cookie.py模块支持冒号做key的方法
Dec 28 #Python
python封装对象实现时间效果
Apr 23 #Python
python下函数参数的传递(参数带星号的说明)
Sep 19 #Python
You might like
我的群发邮件程序
2006/10/09 PHP
收集的PHP中与数组相关的函数
2007/03/22 PHP
php fsockopen伪造post与get方法的详解
2013/06/14 PHP
简介WordPress中用于获取首页和站点链接的PHP函数
2015/12/17 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
慎用 somefunction.prototype 分析
2009/06/02 Javascript
通过jquery的$.getJSON做一个跨域ajax请求试验
2011/05/03 Javascript
ajax的hide隐藏问题解决方法
2012/12/11 Javascript
jquery select多选框的左右移动 具体实现代码
2013/07/03 Javascript
jQuery大于号(&gt;)选择器的作用解释
2015/01/13 Javascript
跟我学习javascript的var预解析与函数声明提升
2015/11/16 Javascript
javascript函数命名的三种方式及区别介绍
2016/03/22 Javascript
Angular JS数据的双向绑定详解及实例
2016/12/31 Javascript
webpack4.0打包优化策略整理小结
2018/03/30 Javascript
vue-cli3.0配置及使用注意事项详解
2018/09/05 Javascript
从零搭一个自用的前端脚手架的方法步骤
2019/09/23 Javascript
[05:16]《大圣!大圣》——DOTA2新英雄齐天大圣配音李世宏老师专访
2016/12/13 DOTA
python正则分组的应用
2013/11/10 Python
Python中使用第三方库xlrd来写入Excel文件示例
2015/04/05 Python
Python实现Linux命令xxd -i功能
2016/03/06 Python
Python三级菜单的实例
2017/09/13 Python
python+Splinter实现12306抢票功能
2018/09/25 Python
Python模拟浏览器上传文件脚本的方法(Multipart/form-data格式)
2018/10/22 Python
Python中flatten( )函数及函数用法详解
2018/11/02 Python
Python2和Python3.6环境解决共存问题
2018/11/09 Python
Form表单及django的form表单的补充
2019/07/25 Python
Python中xml和dict格式转换的示例代码
2019/11/07 Python
Pyecharts绘制全球流向图的示例代码
2020/01/08 Python
Window版下在Jupyter中编写TensorFlow的环境搭建
2020/04/10 Python
python如何求100以内的素数
2020/05/27 Python
python如何输出反斜杠
2020/06/18 Python
Becextech新西兰:数码单反相机和手机在线商店
2018/04/27 全球购物
六五普法规划实施方案
2014/03/21 职场文书
MySQL库表名大小写的选择
2021/06/05 MySQL
Redis超详细讲解高可用主从复制基础与哨兵模式方案
2022/04/07 Redis
教你在 Java 中实现 Dijkstra 最短路算法的方法
2022/04/08 Java/Android