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;

偷偷地把文件编码改成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;

无济于事。。。
既然它提供了网址,那就看看吧。简单地浏览一下,终于知道如果文件里有非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直接把字符串传递给操作系统,所以你需要把str解码成与操作系统一致的格式。Windows使用CP936(几乎与gbk相同),所以这里可以使用gbk。
最后测试:
# coding=utf-8
s = "中文"
print unicode(s, "cp936")
结果:中文

Python中使用中文相关推荐

  1. 在python中使用中文_Python中使用中文的方法

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

  2. python中的中文乱码问题深入分析

    网址 :http://www.jb51.net/article/26543.htm 在本文中,以'哈'来解释作示例解释所有的问题,"哈"的各种编码如下: 1. UNICODE (U ...

  3. python中字符串中文乱码_[python] 中文乱码问题

    乱码产生的原因 乱码产生的根本原因是字节流转换字符前后不一致导致.只要掌握了这个核心,就能解决乱码问题.python2中使用了一些"trick"(没有区分字符和字节流),所以理解起 ...

  4. python中解决中文乱码

    解决中文乱码 什么是字符编码 python 的字符编码 encode和decode unicode还可以decode吗? UTF-8还可以encode吗? 解决中文编码问题 问题1:使用request ...

  5. python使用中文-Python中使用中文

    这个问题曾在我初学Python的时候令我头疼不已,尤其是目前我们因为各种包的原因还只能使用2.x的版本.在3.x中字符编码已经统一用Unicode了. Python 默认支持的是ASCII字符,包含了 ...

  6. python可以使用中文_如何在Python中使用中文

    Xc.Li Feb.2016 本文用一个程序解释了如何在python2.7和pycharm中使用中文进行显示,中文作为判断参数,中文作为正则表达式的参数等涉及中文的代码问题. 系统环境:Python2 ...

  7. Python中使用中文正则表达式匹配指定的中文字符串

    业务场景: 从中文字句中匹配出指定的中文子字符串 .这样的情况我在工作中遇到非常多, 特梳理总结如下. 难点: 处理GBK和utf8之类的字符编码, 同时正则匹配Pattern中包含汉字,要汉字正常发 ...

  8. python中使用中文字符,文件首行添加# -*- coding: utf-8 -*-后仍然报错(unicode error) ‘utf-8‘ codec can‘t decode byte 0xc4

    1. 添加 # -*- coding: utf-8 -*- 我们在python文件中敲上最简单的一行代码,print('你好'),然后在命令行运行文件,报错如下:SyntaxError: Non-UT ...

  9. Python中添加中文注释报错SyntaxError: Non-UTF-8 code starting with '\xc1'

    问题:在文本编辑器中编辑Python文件时添加中文注释,运行python文件时报错.SyntaxError: Non-UTF-8 code starting with '\xc1' 解决方法:在文本开 ...

最新文章

  1. 管理Exchange服务器
  2. 聚类算法:Hierarchical Clustering层次聚类
  3. 【设计干货】Facebook设计APP时的14个必考题
  4. 图像语义分割:U-Net网络和PSP网络
  5. 计算机桌面ie图标无法删除,win7系统桌面ie图标无法删除怎么办
  6. subprocess中执行git命令报告no such file or directory一例
  7. Nginx前端设置反向代理,后端Apache如何获取访客的真实IP,结合PHP
  8. Resumable.js - 基于HTML5 File API的可断点续传的文件上传插件
  9. [转]Sandboxie 的工作原理
  10. 点击触发ajax重复提交表单,屡次连续点击致使Ajax重复提交
  11. Java GUI社团管理系统课程设计
  12. 两台计算机怎样共享一台打印机共享文件夹,二台不同系统电脑怎么样共享一台打印机...
  13. 想查看微信好友撤回的消息?Python帮你搞定
  14. npm 及 webpack打包工具
  15. MySQL安装出现的问题
  16. HTML期末大作业 使用HTML+CSS制作科技文化主题网站(航天之路)
  17. 港中文旷视提出PanopticFCN:用于全景分割的全卷积网络
  18. jquery省市县三级联动
  19. 获取美元人民币实时汇率-Python版
  20. mye连接mysql数据库_MySQL_如何在Java程序中访问mysql数据库中的数据并进行简单的操作,在上篇文章给大家介绍了Myeclip - phpStudy...

热门文章

  1. c 语言教程文档,c语言基本教程
  2. mysql 5.7.17 rpm安装_MySQL5.7.17 RPM方式安装
  3. java中的祖先类_Java程序公共祖先类-Object
  4. java实现磁盘分配显示_Java实现窗体动态加载磁盘文件
  5. ESP8266使用历程
  6. 机器学习Tensorflow基于MNIST数据集识别自己的手写数字(读取和测试自己的模型)
  7. Nat Mach Intell | 江瑞课题组提出首个针对单细胞染色质开放性数据的细胞类型辨识神经网络模型EpiAnno...
  8. Cell Research | 单细胞测序技术揭示派杰氏病的致病机制
  9. 功能强大的TCGA再分析平台
  10. 摄像头分辨率怎么调整_手机摄像头测试:细数手机摄像头由单摄到多摄有哪些变化...