作者wohtp (会喵喵叫的大叔)
看板Python
标题[问题] python读档时不认得中文字?
时间Wed Oct 8 16:24:59 2014
第一次来这里问问题,请各位板友指教!
其实我猜这大概不是python本身的问题...
环境:Windows 8.1 64-bit,非unicode编码是繁中
Python 3.4.1 (Anaconda 2.1.0 64-bit)
文字档编辑器试过notepad和notepad++,都有记得指定utf-8编码
如果我在interpreter下面直接打
s = '中文测试'
这样一切都很好,python 3直接认得unicode,我要
s[0] 它就给我
'中',等等。
但是如果我另外存一个
test.txt,内容一样只有
中文测试 四个字,然後做
f = open('test.txt')
s = f.read()
只会吃到这个exception:
UnicodeDecodeError: 'cp950' codec can't decode byte 0xe6 in position 6:
illegal multibyte sequence
请大家开始隔空抓药,谢谢!
--
你喜欢下列哪一个学妹?
1. 虽然吉他弹得比学姊好,在乐团里却甘愿只当个副手
2. 拥有夏天一到必然黑化的体质,连同学好友都认不出来
3. 虽然嘴巴很严厉,但只要用甜点就可以收买,尤其喜欢鲷鱼烧
4. 讨厌学姊给她取的奇怪绰号,却给小猫取了同一个名字
5. 极力维持自己严肃的形象,但是一戴上猫耳就会不自觉喵喵叫
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.110.141.102
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/Python/M.1412756706.A.390.html
1F:→ uranusjr: 不是 Python 认不得, 是 command prompt 认不得 10/08 16:32
command line interpreter直接输入中文没问题,是读档才有问题
※ 编辑: wohtp (123.110.141.102), 10/08/2014 16:34:14
等下,我发现问题了...为什麽python会去用cp950(就是big5)解码中文字?
然後我照楼上说的,
r = codecs.getreader('utf8')(f)
r.read()
照样给我那个cp950不识字的exception。
※ 编辑: wohtp (123.110.141.102), 10/08/2014 16:52:16
3F:→ os653: 要指定open的参数encoding呀... 10/08 16:43
f = open('test.txt', encoding = 'utf8')
这样就好了。
书上说预设就是utf-8啊!跟说好的不一样(大哭)(滚)
※ 编辑: wohtp (123.110.141.102), 10/08/2014 16:55:26
4F:→ alibuda174: open的encoding会因平台不同而不同 10/08 17:00
现在变成读得进去显示不出来:
s = f.read() 这个过去了
print(s) 同一个exception。为什麽这麽爱用cp950!
※ 编辑: wohtp (123.110.141.102), 10/08/2014 17:05:34
5F:→ os653: 别打print(s),打s看结果,还有notepad存的是utf-8-sig 10/08 17:11
有读进去了。直接打s会echo
'\ufeff中文测试'
所以我终於懂了,一切还是源自Windows对big5病态的爱 orz
不能print()很麻烦耶,这样要怎麽debug?
※ 编辑: wohtp (123.110.141.102), 10/08/2014 17:19:56
6F:→ alibuda174: print会输出到sys.stdout 而它的encoding可能是cp950 10/08 17:37
7F:→ alibuda174: 可以把sys.stdout的encoding换掉 10/08 17:39
8F:→ alibuda174: 或是把读进来的字串 转换它的encoding 10/08 17:39
9F:→ alibuda174: 或是一开始就把档案储存成cp950的encoding 10/08 17:40
10F:→ os653: 那个\ufeff就是叫你用utf-8-sig,还有这跟Windows没啥关系 10/08 17:56
我整理一下现在的状况:
1. 至少在我这台win8机器上面,
open()需要
encoding = 'utf8'才能正常
读取/输入unicode
2. 不管是cmd.exe还是windows powershell,用
print()显示unicode的问
题千错万错都是windows的错
http://bugs.python.org/issue1602
3. 有workaround,我还没试
https://github.com/Drekin/win-unicode-console
(我还不会在Anaconda上面装东西呢 -_-)
※ 编辑: wohtp (123.110.141.102), 10/08/2014 19:01:42
11F:→ os653: 那个...我意思是用encoding='utf-8-sig',你应该就能print 10/08 19:37
12F:→ os653: 如果不用其他国家的语言(或混用coding),理论上都能print 10/08 19:39
感谢楼上 <(_ _)><(_ _)><(_ _)>
notepad或notepad++的utf-8编码文件:
open('filename', encoding = 'utf-8-sig') 这样读写显示都可以
notepad++的utf-8 without BOM文件:
open('filename', encoding = 'utf8') 一样可以读写显示
可是这BOM,果然千错万错还是windows的错!
※ 编辑: wohtp (123.110.141.102), 10/08/2014 20:18:42
※ 编辑: wohtp (123.110.141.102), 10/08/2014 20:19:20
13F:→ alibuda174: 推os653,thanks. 10/08 22:39
14F:推 ccwang002: 补充一下,如果是英文系统应该是无法正确显示字 10/08 23:54
15F:→ ccwang002: 但它印出的 □ 在其他程式贴上能显示 (powershell) 10/08 23:56
16F:→ zerof: windows command 预设是 950 10/09 17:28