簡體   English   中英

從stdin讀取的XML文件的正確編碼

[英]Correct encoding for XML file read from stdin

考慮到我需要從stdin讀取XML文件。 如何正確編碼?

目前我只是做

xmlString = sys.stdin.read()
doc = xml.dom.minidom.parseString(xmlString)

顯然, xmlString並非總是正確地解碼,從而導致字符解釋錯誤。

是否有可能解決此問題,或者我必須“按原樣”使用從stdin獲得的內容?

編輯:假設通過stdin提供的文件是帶有正確XML聲明的SVG文件,例如,考慮一下

<?xml version="1.0" encoding="UTF-8">
<svg xmlns="http://www.w3.org/2000/svg">
  <desc>ú</desc>
</svg>

這意味着可以使用encoding屬性來檢測編碼(但是顯然我必須至少讀取第一行),然后,我將不得不使用檢測到的編碼以某種方式調整從stdin讀取。

在這種情況下,解決方案最簡單。

try:
    input = sys.stdin.buffer
except AttributeError:
    input = sys.stdin

xmlString = input.read()
doc = xml.dom.minidom.parseString(xmlString)

stdin作為二進制流打開(即未解碼)。 在我的特殊情況下,XML解析器可以很好地自行處理解碼,因此不需要我付出任何努力。

請注意,默認情況下,Python 3以文本模式(已解碼)打開stdin ,但在許多情況下顯然使用錯誤的字符編碼。 因此, buffer屬性是訪問基礎二進制流所必需的。 異常處理是必需的,因為這是早期版本的Python中的默認行為,並且buffer屬性不可用。

如果文件編碼每次都可能不同,並且完全未知,則可以使用chardet猜測其編碼。 請注意,它使用一些統計數據來找到最佳匹配,因此並非完美。

如果您知道數據的編碼,則有兩個選擇。 PYTHONIOENCODING變量 ,或使用str.decode

暫無
暫無

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

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