2017-05-31 312 views
0

我使用xmlcharrefreplace來替換字符串中的非標準字符,以便它可以保存在xml文件中。後來,我想重新將此字符串轉換回原始字符。Python字符串編碼xmlcharrefreplace解碼

import openpyxl 
import cgi 
from html.parser import HTMLParser 
parser = HTMLParser() 

startingString = "Tỉnh Đồng Nai" #example string 
print("Starting string: " + startingString) #Starting string: Tỉnh Đồng Nai 

# 1. This string contains non-standard characters. Convert these characters using xmlcharrefreplace 
escapedString = cgi.escape(startingString) 
strEscapedString = str(escapedString) 
aposString = strEscapedString.replace("'", "'") 
savedToExcelString = str(aposString.encode('utf-8', 'xmlcharrefreplace'))[2:-1] 

print("xmlcharrefreplace converted to: " + savedToExcelString) #xmlcharrefreplace converted to: T\xe1\xbb\x89nh \xc4\x90\xe1\xbb\x93ng Nai 

# 2. The string is saved to an xml file 
# 3. The string is read from an xml file 

# 4. Convert the string back into the original starting string 
unescapedString = parser.unescape(savedToExcelString) 
#what do I do here??? I need to 'undo' the xmlcharrefreplace encoding 

print(startingString + " == " + unescapedString + " is " + str(startingString == unescapedString)) 
# Tỉnh Đồng Nai == T\xe1\xbb\x89nh \xc4\x90\xe1\xbb\x93ng Nai is False 
# ^^ Should be the same string at the end 

請注意,我不能使用codecs.open(),因爲我使用的庫openpyxl打開包含數據以及Excel文件。對輸入可能是什麼字符沒有限制 - 我希望最終字符串與初始字符串相同。

目標:將字符從xmlcharrefreplace轉換回其腳本字符。 例如:「\ x90」變成「ồ」

回答

0

你所描述的是不可能的,一般。當你從一個大字符集(任何東西)轉換到一個較小的字符集時,你會失去信息。除非您對編碼結果有限制,否則您無法對可以反轉的內容進行編碼。但是,如果您與標籤上的數據庫有一些協議,將在輸入中出現而不是(例如字符序列「\ x」),則可以使用其中的一個或多個來表示編碼字符串,並且您可以在該區域創建任何您喜歡的代碼。例如,請注意示例輸入後面如何顯示爲"T\xe1\xbb\x89nh \xc4\x90\xe1\xbb\x93ng Nai"

如果這對您有用,我建議您創建一個一對一的映射,存儲在字典(及其反向)中,並在關鍵步驟中向兩個方向索引字典。我假設您可以自己處理檢測邏輯(編碼時爲非ASCII字符;解碼時爲標記序列)。

+0

謝謝,這是正確的答案。不幸的是字典映射的想法不適用於這個程序架構。 –