簡體   English   中英

python-如何在utf8中正確編碼字符串,即XML中的ISO8859-1

[英]python - How to properly encode string in utf8 which is ISO8859-1 from xml

我在python 2.7中使用以下代碼來檢索xmlFile,其中包含一些德國變音符,例如ä,ü,ö,ß:

.....
def getXML(self,url):
    xmlFile=urllib2.urlopen(self.url)
    xmlResponse=xmlFile.read()
    xmlResponse=xmlResponse
    xmlFile.close()
    return xmlResponse
    pass

def makeDict(self, xmlFile):
    data = xmltodict.parse(xmlFile)
    return data

def saveJSON(self, dictionary):
    currentDayData=dictionary['speiseplan']['tag'][1]
    file=open('data.json','w')
    # Write the currentDay as JSON 
    file.write(json.dumps(currentDayData))
    file.close()
    return True
    pass

 # Execute
 url="path/to/xml/"
 App=GetMensaJSON(url)
 xml=GetMensaJSON.getXML(App,url)

 dictionary=GetMensaJSON.makeDict(App,xml)
 GetMensaJSON.saveJSON(App,dictionary)

問題在於xml文件在其<xml>標記中聲稱它是utf-8。 但是事實並非如此。 通過嘗試,我發現它是iso8859_1,因此我想從utf-8轉換為iso8859,然后再轉換回utf-8來解決沖突。

是否有解決遺漏的變音符號的優雅方法? 例如,在我的代碼中,我用ß \Ã\Ÿ代替ü \Ã\¼

我發現了類似的問題,但無法正常工作如何在Python中使用編碼聲明解析XML文件?

我還應該補充一點,我不能影響我獲取xml的方式。

可以在代碼中找到XML File Link。

“ repr(xmlResponse)”的輸出為

 "<?xml version='1.0' encoding='utf-8'?>\n<speiseplan>\n<tag timestamp='1453676400'>\n<item language='de'>\n<category>Stammessen</category>\n<title>Gem\xc3\x83\xc2\xbcsebr\xc3\x83\xc2\xbche mit Backerbsen (25,28,31,33,34), paniertes H\xc3\x83\xc2\xa4hnchenbrustschnitzel (25) mit Paprikasauce (33,34), Pommes frites und Gem\xc3\x83\xc2\xbcse

您正在嘗試對已經編碼的數據進行編碼 urllib2.urlopen()只能返回一個字節串,而不是unicode ,因此編碼沒有意義。

相反,發生的事情是Python在這里試圖提供幫助。 如果您堅持對字節進行編碼,那么它將首先對字節進行解碼以對數據進行unicode 並且它將為此使用默認編解碼器。

最重要的是,XML文檔本身負責記錄應使用哪種編解碼器進行解碼。 默認編解碼器為UTF-8,請勿自行手動重新編碼數據,而應將其留給XML解析器。

如果您的XML文檔中有Mojibake數據 ,則解決此問題的最佳方法是在解析后進行修復。 我建議使用ftfy軟件包為您執行此操作。

可以通過先解碼為UTF-8,然后再次編碼為Latin-1 手動“修復”編碼:

xmlResponse = xmlFile.read().decode('utf-8').encode('latin-1')

但是,這假設您的數據一開始就被錯誤地解碼為Latin-1。 這並不總是一個安全的假設。 例如,如果將其解碼為Windows CP 1252,則恢復數據的最佳方法是仍然使用ftfy

您可以將XML解析為XML 之前嘗試使用ftfy ,但這取決於文檔未使用文本和屬性內容之外的任何非ASCII元素:

xmlResponse = ftfy.fix_text(
    xmlFile.read().decode('utf-8'),
    fix_entities=False, uncurl_quotes=False, fix_latin_ligatures=False).encode('utf-8')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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