[英]Utf-8 on windows python
我有讀取解析等內容的html文件,它使用unicode編碼(我在記事本中看到了),但是當我嘗試
infile = open("path", "r")
infile.read()
它失敗了,我遇到了著名的錯誤:
UnicodeEncodeError:“ charmap”編解碼器無法對位置xx處的字符進行編碼:字符映射為未定義
因此,為了進行測試,我嘗試將文件的包含內容復制粘貼到一個新文件中,然后將其保存在utf-8中,然后嘗試使用像這樣的編解碼器將其打開:
inFile = codecs.open("path", "r", encoding="utf-8")
outputStream = inFile.read()
但我收到此錯誤消息:
UnicodeEncodeError:'charmap'編解碼器無法在位置0編碼字符u'\\ ufeff':charcater映射為undefined
我真的不明白,因為我是在utf8中創建的。
UnicodeEncodeError
建議該代碼將 Unicode文本編碼為字節時失敗,即您的實際代碼嘗試打印到Windows控制台。 請參閱Python,Unicode和Windows控制台 。
上面的鏈接修復了UnicodeEncodeError
。 下一個問題是找出"path"
文件中文本使用的字符編碼。 如果notepad.exe
正確顯示了文本,則意味着它是使用locale.getprefferedencoding(False)
進行編碼的(類似於Windows上的cp1252
)或文件具有BOM 。
如果您確定編碼為utf-8,則將其直接傳遞給open()
。 不要使用codecs.open()
:
with open('path', encoding='utf-8') as file:
html = file.read()
有時,輸入內容可能包含使用多種(不一致)編碼進行編碼的文本,例如,智能引號可能使用cp1252
進行編碼,而html的其余部分為utf-8 -您可以使用bs4.UnicodeDammit
對其進行bs4.UnicodeDammit
。 另請參閱在Python中獲取HTTP響應的字符集/編碼的好方法
預期OP將更新問題以反映實際問題,此問題是由於未定義終端的編碼引起的。
眾所周知,Windows控制台的Unicode支持很差。 要獲得最終支持,請參閱https://pypi.python.org/pypi/win_unicode_console 。 本質上,安裝“ win_unicode_console”( pip install win_unicode_console
)。 然后在代碼的頂部:
import win_unicode_console
win_unicode_console.enable()
您可能還需要使用合適的字體-請參閱https://stackoverflow.com/a/5750227/1554386
當您使用帶有UTF-8 BOM的輸入時,應使用utf_8_sig
編解碼器,以便在處理內容之前剝離BOM。
因為這是Python 3,所以在使用open()
時無需使用codecs
模塊來設置編碼。
放在一起看起來像:
import win_unicode_console
win_unicode_console.enable()
infile = open("path", "r", encoding="utf_8_sig")
原始文件可能使用utf-16
(Windows使用術語UNICODE表示該編碼)。
Windows上的UTF-8編碼文件通常以魔術數字b"\\xef\\xbb\\xbf"
(U + FEFF的UTF-8編碼)開頭,因此讀取該文件的應用程序知道該文件已保存為UTF-8,而不是某些ANSI。代碼頁。 utf8-sig
,它將自動丟棄該字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.