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 noencodingdeclared; 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 noencodingdeclared; 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格式时,
运行时报错:

# coding=gbk
import codecs
print open("Test.txt").read().decode("utf-8")

原来,某些软件,如notepad,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
因此我们在读取时需要自己去掉这些字符,python中的codecs module定义了这个常量:

#coding=gbk
import codecs
print open("Test.txt").read().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")

转载于:https://www.cnblogs.com/icamel/archive/2012/05/24/2516546.html

Python疑难杂症:SyntaxError: Non-ASCII character Python中文处理问题相关推荐

  1. Python自动化运维之一(Python入门)

    Python简介 python是吉多·范罗苏姆发明的一种面向对象的脚本语言,可能有些人不知道面向对象和脚本具体是什么意思,但是对于一个初学者来说,现在并不需要明白.大家都知道,当下全栈工程师的概念很火 ...

  2. 学习python时报SyntaxError: Non-ASCII character '\xe5' in file解决方法

    最近在学习python时遇到一个报错信息,信息内容如下: SyntaxError: Non-ASCII character '\xe5' in file ex6.py on line 3, but n ...

  3. python :SyntaxError: Non-ASCII character '\xe5' in file 错误

    运行程序时,python出现 "SyntaxError: Non-ASCII character '\xe5' in file" 错误,信息中给出了一个网址可以查看详细信息: 错误 ...

  4. Python 问题 SyntaxError: Non-ASCII character '\xe9' in file

    SyntaxError: Non-ASCII character '\xe9' in file XX.py on line X but no encoding declared; see http:/ ...

  5. Python 错误 SyntaxError: Non-ASCII character ‘\xe4‘ in file

    Python 错误 SyntaxError: Non-ASCII character '\xe4' in file flyfish SyntaxError: Non-ASCII character ' ...

  6. python中文名是什么怎么读-python中文读音

    广告关闭 腾讯云双11爆品提前享,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高满返5000元! 本篇分享的是使用python3制作一个文本读音器,简单点就是把指定的文本文字转语音 ...

  7. python语音合成 标贝_tacotronV2 + wavernn 实现中文语音合成(Tensorflow + pytorch)

    TacotronV2 + WaveRNN 开源中文语音数据集标贝(女声)训练中文TacotronV2,实现中文到声学特征(Mel)转换的声学模型.在GTA模式下,利用训练好的TacotronV2合成标 ...

  8. Python - Sublime Text 3 控制台不能输出中文的解决方法

    Python - Sublime Text 3 控制台不能输出中文的解决方法 参考文章: (1)Python - Sublime Text 3 控制台不能输出中文的解决方法 (2)https://ww ...

  9. python报错UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe8 in position 0 解决方案

    python报错UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 0 解决方案 参考文章: (1)python报 ...

  10. python之禅 中文_《Python之禅》中对于Python编程过程中的一些建议

    <Python之禅>中对于Python编程过程中的一些建议 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  <Python之禅>中对于Pyt ...

最新文章

  1. Entity FrameWork 365日系列文章源码研究 (1)
  2. slim android7 nexus7,【畅玩7.0】加一直升pure nexus 7.0系统简单教程(1106更新)
  3. 创建azure服务器
  4. ubuntu18.04 安装qt5.12.8及环境配置的详细教程
  5. Nancy之从403到错误处理
  6. mysql 锁_浅谈MySQL的七种锁
  7. 我的世界手游java版的光影_我的世界光影整合包1.7.2
  8. json格式转csv格式
  9. win10局域网 开启网络发现,无法找到本机
  10. 对静态页面的一些理解
  11. zencart网店模板
  12. 图论最短路 之 弗洛伊德Floyd(详细分析)
  13. DataV 3D 平面地图 2.0 焕新上线
  14. ICME2021:基于机器学习的VVC帧内编码码率控制
  15. 有声音显示音频服务器,Win7右下角声音图标显示音频服务未运行的解决方法小结...
  16. 防360屏蔽办法 代码一
  17. Datawhale组队学习-NLP新闻文本分类-TASK06
  18. 【presto】presto 常用的命令
  19. 前端对浏览器性能优化
  20. 中级软件设计师考试(软考中级)网络与信息安全基础

热门文章

  1. python递归列文件_python-Bash:从最大列递归地向文件写入一行
  2. python科学计算和可视化编程软件_python科学计算与可视化
  3. bootstrap 单选按钮点击change事件 只触发一次_微信支付新增“确认”按钮,付错钱将成为历史?...
  4. java kmp算法_KMP算法java版实现
  5. js中every用法_js数组中的方法 some, every, filter, find,map, reduce讲解及使用场景
  6. c语言行列倒置算法,循环行列的元素倒置。求指点
  7. 安卓耗电监控app_Android系统十大耗电应用拍照APP排第一
  8. 微型计算机原理课程设计计算器,微机原理课程设计简易计算器的设计.docx
  9. flex 引入css,Flex常用布局
  10. 嵌入式大牛常用的十大C/C++开发利器