python中文字符编码问题
2019獨角獸企業重金招聘Python工程師標準>>>
問題來源:需要對爬取到的如下文本進行分隔,且以“:”(中文冒號)進行分隔。
對應文本分隔代碼:
IrmComTemp = IrmCom.strip().split(unicode(':','utf-8'))問題1描述:出現如下錯誤:SyntaxError: Non-ASCII character '\xef' in file?
問題1解決:在源碼第一行(必須保證是第一行)添加如下字符編碼限定語句:
# -*- coding: UTF-8 -*-問題1原因:python2會默認使用ASCII編碼,而ASCII編碼不支持中文,所以會出現異常(具體回顧之前關于編碼的文章)。如果要在python2的py文件里面寫中文,則必須要添加這一行聲明文件編碼的注釋。
問題2描述:添加之后又出現UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0:錯誤
問題2解決:
#錯誤代碼 IrmComTemp = IrmCom.strip().split(':','utf-8') #正確代碼 IrmComTemp = IrmCom.strip().split(unicode(':','utf-8'))問題2原因:(參考'ascii' codec can't decode byte 0xef in position 0:ordinal not in range(128)錯誤解決與原理分析)utf-8只是Unicode字碼表的編碼方式,Unicode除此之外還可以使用utf-16等編碼成byte code儲存,在Python中我們已經指定了utf-8編碼方式,那么所有帶中文的字符串都會被認為是utf-8編碼的byte string(例如:':'),但是在函數中所產生的字符串則被認為是unicode string。unicode string 和 byte string 是不可以混合使用的,一旦混合使用了,就會產生這樣的錯誤。
本文中,函數返回的爬取下來的網頁被認為是Unicode string,':'被認為是byte string,由于預設的解石馬器(醉了,提交的時候說這里敏感。。。。)是ascii,所以就不能識別中文byte string。然后就報錯了。
參考的博文中作者提供了兩種解決方案:1》unicode string轉byte string;2》byte string 轉unicode string。總之就是統一編碼。
由于對爬取下來的網頁進行轉換比較麻煩,所以我們這里使用byte轉unicode的方案,另一種方案尚待嘗試。
轉載于:https://my.oschina.net/u/3636678/blog/1860243
總結
以上是生活随笔為你收集整理的python中文字符编码问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【7.19 graphshortestp
- 下一篇: 一份比较详细的 webpack 4.x