簡體   English   中英

Windows Python上的UTF-8

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM