關於python 2.x中文字編碼的簡單說明

2012-05-08 15:01:03 +08:00
 013231
剛剛看到有人在糾結文字編碼的問題, 我來說一下我的理解.
我也是Python新手, 此文中如有錯誤請指正.

1. 如果文件含有非ASCII字符, 在開頭加一行註釋:
# encoding=utf-8
# 如果你的源代碼文件不是UTF-8編碼, 把'utf-8'換成相應的編碼

否則你會遭遇
SyntaxError: Non-ASCII character
錯誤.


2. str類型是字節序列而非字符序列. 它的編碼方式由文件本身的編碼方式或encode時指定的編碼方式決定:
1. 寫在源文件中的str, 編碼方式爲源文件的編碼方式.
2. 從其它文件中讀取的str, 就是那個文件中的字節序列, 不做任何轉換.
3. 使用encode方法得到的str, 其編碼爲指定編碼.
對str使用len, 會返回字節序列的長度:
UTF-8環境下, '文字'的字節序列爲0xe6 0x96 0x87 0xe5 0xad 0x97, len('文字') == 6.
GB18030環境下, '文字'的字節序列爲0xce 0xc4 0xd7 0xd6, len('文字') == 4


3. unicode類型是字符序列, 無需關心它內部的編碼方式(可能爲USC-2或USC-4).
無論編碼爲何, len(u'文字') == 2.


4. encode的作用是把字符序列編碼成字節序列(unicode -> str), decode的作用是把字節序列解碼成字符序列(str -> unicode). 如果對unicode使用encode或對str使用decode, 會得到錯誤或無意義的結果.

5. __str__必須返回str類型, __unicode__必須返回unicode類型. 否則會收到TypeError.
4625 次点击
所在节点    Python
12 条回复
reus
2012-05-08 15:11:31 +08:00
很清楚明白
arzon
2012-05-08 15:35:07 +08:00
各种情况都解释地很清楚.
还不太了解python文字编码机制的同学可以看看.
loading
2012-05-08 16:07:00 +08:00
为了表示感谢,回复一个。5个铜币,亲收下^_^
Yo_oY
2012-05-12 14:35:49 +08:00
回复一下以示感谢
luztak
2012-05-27 16:31:07 +08:00
好文章
luztak
2012-05-27 16:31:16 +08:00
好文章
luztak
2012-05-27 16:31:22 +08:00
好文章,收藏了
luztak
2012-05-27 16:31:33 +08:00
好文章,说得很清楚,收藏了
chaojie
2012-09-23 10:34:39 +08:00
.py文件
文件是utf-8编码(without BOM)

文件头部写有
#-*-coding:utf-8-*-
#-*-encoding=utf-8

文件中直接输入汉字

文件编译通过
运行时Exception输出
'ascii' codec can't decode byte 0xef in position 8: ordinal not in range(128)

这是什么原因?
013231
2012-09-23 12:34:08 +08:00
@chaojie 請貼出具體的出錯代碼.
我猜測你在decode一個包含非ASC II字符的str時未指定編碼, 或指定了ASC II編碼.
'測試'.decode('ascii') #UnicodeDecodeError, '測試'兩字是非ASC II字符.
'測試'.decode() #UnicodeDecodeError, 默認編碼是ASC II.
'測試'.decode('utf-8') #正確指定了編碼, 返回u'測試'.
chaojie
2012-09-23 13:47:17 +08:00
@013231 谢谢

找到原因了,是我post过来的一个参数的问题
jiazhoulvke
2012-09-23 18:51:44 +08:00
很收益,谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/35110

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX