国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

python相關編碼[轉]

2019-11-14 17:21:28
字體:
來源:轉載
供稿:網友

python 相關編碼[轉]

 

三篇文章,導航:()()()

(一)

怎么避免UnicodeEncodeError: ‘ascii’ codec can’t…類似的錯誤?

1、首先在py文件頭部指定文件內容編碼,例如:# coding: utf8

2、文件保存的時候要和py文件頭部編碼一致

3、在用decode和encode的時候,一定要確認要轉換的字符原編碼是什么。

例如:網頁中都會指定編碼(<meta http-equiv=content-type content=”text/html; charset=gb2312&PRime;>), 你在抓取這個網站并獲取它的html后進行編碼轉化就要注意了:

import urllib2

html = urllib2.urlopen(url)

html = html.decode(‘gb2312′)

只要做上面三個就不會出現轉換編碼錯誤了

python建議,在python代碼中最好所有變量都是unicode;     流程可以這么寫: 變量(轉換成unicode)——>python代碼——–>變量(轉換成其他編碼)

sys.getdefaultencoding():系統的缺省編碼(一般就是ascii),python默認語言的編碼是ascii編碼, 這就是為什么在py文件的頭部都要指定編碼了# coding:utf-8

Python獲取系統編碼參數的幾個函數

系統的缺省編碼(一般就是ascii):sys.getdefaultencoding()    系統當前的編碼:locale.getdefaultlocale()     系統代碼中臨時被更改的編碼(通過locale.setlocale(locale.LC_ALL,“zh_CN.UTF-8″)):locale.getlocale()     文件系統的編碼:sys.getfilesystemencoding()     終端的輸入編碼:sys.stdin.encoding     終端的輸出編碼:sys.stdout.encoding     代碼的缺省編碼:文件頭上# -*- coding: utf-8 –*-

來源:http://justpy.com/archives/144

(二)

更多:

http://m.survivalescaperooms.com/itrust/archive/2010/05/14/1735185.html

字符串

python有兩種字符串
1
2
byteString = "hello world! (in my default locale)"
unicodeString = u"hello Unicode world!"
相互轉換
1
2
3
4
1 s = "hello normal string"
2 u = unicode( s, "utf-8" )
3 backToBytes = u.encode( "utf-8" )
3 backToUtf8 = backToBytes.decode(‘utf-8’) #與第二行效果相同
如何判斷
1
2
3
if isinstance( s, str ): # 對Unicode strings,這個判斷結果為False
if isinstance( s, unicode): # 對Unicode strings,這個判斷結果為True
if isinstance( s, basestring ): # 對兩種字符串,返回都為True

做個試驗

1
2
3
4
5
6
import sys
print 'default encoding: ' , sys.getdefaultencoding()
print 'file system encoding: ' , sys.getfilesystemencoding()
print 'stdout encoding: ' , sys.stdout.encoding
print u'u"中文" is unicode: ', isinstance(u'中文',unicode)
print u'"中文" is unicode: ', isinstance('中文',unicode)

看輸出結果,注意下列事實:

python系統缺省的編碼格式為ASCII,這個缺省編碼在Python轉換字符串時用的到,這里給兩個例子:

1. a = "abc" + u"bcd", Python會如此轉換"abc".decode(sys.getdefaultencoding()) 然后將兩個Unicode字符合并。

2. print unicode('中文') , 這句話執行會出錯“UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 …”,是因為Python試圖用缺省編碼來編碼,而這個字符串不是ASCII,因此需要顯示的指出,如果你的文件源類型為utf-8,則應如此:print unicode('中文','utf-8’)

Windows下getfilesystemencoding輸出mbcs(多字節編碼,windows的mbcs,也就是ansi,它會在不同語言的windows中使用不同的編碼,在中文的windows中就是gb系列的編碼)

Windows下控制臺編碼為cp936, 當你打印東西到控制臺時Python自動做了轉換。這里會引發一個有趣的問題, 試一下這個簡單的例子test.py:

1
2
3
# -*- coding: utf-8 -*-
s = u'中文'
print s

在控制臺中分別運行 python test.py 和 python test.py > 1.txt

你會發現后者會報錯,原因是打印控制臺時Python會自動轉換編碼到sys.stdout.encoding, 而輸出到文件時Python不會自動在write調用中進行內部字符轉換。這個問題在PrintFails中有較詳細的說明。

UTF-8編碼格式

保存utf-8格式的文件
1
2
3
import codecs
fileObj = codecs.open( "someFile", "r", "utf-8" )
u = fileObj.read() # Returns a Unicode string from the UTF-8 bytes in the file
自己寫BOM頭
1
2
3
4
out = file( "someFile", "w" )
out.write( codecs.BOM_UTF8 )
out.write( unicodeString.encode( "utf-8" ) )
out.close()
自己去掉BOM頭

對UTF-16, Python將BOM解碼為空字串。然而對UTF-8, BOM被解碼為一個字符,如例:

1
2
3
4
>>> codecs.BOM_UTF16.decode( "utf16" )
u''
>>> codecs.BOM_UTF8.decode( "utf8" )
u'/ufeff'

不知道為什么會這樣不同,因此你需要在讀文件時自己去掉BOM:

1
2
3
4
5
6
7
8
9
10
11
import codecs
if s.beginswith( codecs.BOM_UTF8 ):
    # The byte string s begins with the BOM: Do something.
    # For example, decode the string as UTF-8
     
if u[0] == unicode( codecs.BOM_UTF8, "utf8" ):
    # The unicode string begins with the BOM: Do something.
    # For example, remove the character.
 
# Strip the BOM from the beginning of the Unicode string, if it exists
u.lstrip( unicode( codecs.BOM_UTF8, "utf8" ) )

源碼文件的編碼

關于Python對代碼文件的編碼處理,PEP0263 講的很清楚,現摘錄如下

python缺省認為文件為ASCII編碼。

可在代碼頭一行或二行加入聲明文件編碼申明,通知python該文件的編碼格式,如

     # -*- coding: utf-8 –*-   # 注意使用的編輯器,確保文件保存時使用了該編碼格式

  1. 對于Windows這樣的平臺,它使用了BOM(文件頭三個字節 /xef/xbb/xbf)來申明文件為utf-8編碼,這種情況下:
  • 如果文件中沒有編碼申明,python以utf8處理
  • 如果有編碼申明但不是utf-8, python報錯

==============另外,關于BOM================

(三)

某些軟件,如notepad,在保存一個以UTF-8編碼的文件時,會在文件開始的地方插入三個不可見的字符(0xEF 0xBB 0xBF,即BOM)。    因此我們在讀取時需要自己去掉這些字符,python中的codecs module定義了這個常量:   

1
2
3
4
5
6
# coding=gbk
import codecs
data = open("Test.txt").read()
if data[:3] == codecs.BOM_UTF8:
 data = data[3:]
print data.decode("utf-8")

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南投县| 新竹市| 华亭县| 敦煌市| 乌鲁木齐县| 新竹县| 建瓯市| 肇东市| 泸州市| 南充市| 淳安县| 天津市| 体育| 天柱县| 衡水市| 萨嘎县| 凤冈县| 衡阳县| 广宗县| 泸州市| 信阳市| 法库县| 弥渡县| 安泽县| 杭锦旗| 轮台县| 石狮市| 青海省| 当雄县| 温泉县| 眉山市| 进贤县| 南阳市| 麻城市| 普定县| 福泉市| 建湖县| 隆化县| 嘉善县| 丹阳市| 丹阳市|