2015-11-11 175 views
1

我有下面的代碼:刪除壞字符 「 XC2」 Python字符串

string_msg = '\x80\x01\x00\x00\x00\x00\x53\x58\x00\x1C\x00\x00\x00\x08\x00\x01\x00\x74\x00\x00\x00\x0A\x00\x54\x00\x00\x00\x03' 
print(string_msg) 
if sys.version < '3': 
    print(":".join("{:02x}".format(ord(c)) for c in string_msg)) 
else: 
    print(":".join("{:02x}".format(c) for c in string_msg.encode())) 

在Python 2,結果是:

80:01:00:00:00:00:53:58:00:1c:00:00:00:08:00:01:00:74:00:00:00:0a:00:54:00:00:00:03 

但是在Python 3,結果是:

c2:80:01:00:00:00:00:53:58:00:1c:00:00:00:08:00:01:00:74:00:00:00:0a:00:54:00:00:00:03 

現在我需要在python 3中執行此代碼,所以我必須在開始時刪除第一個字節以刪除「c2」,一切都會好的,b UT嘗試這樣做,用的代碼太多件我在這個論壇上發現,如:

string_msg = string_msg[1:] 
string_msg.replace('\xC2', '') 
string_msg = ''.join([i if ord(i) < 130 else '' for i in string_msg]) 

結果總是相同的:

01:00:00:00:00:53:58:00:1c:00:00:00:08:00:01:00:74:00:00:00:0a:00:54:00:00:00:03 

也卸下第二個字節80,所以我的問題是:我怎樣才能刪除第一個字節c2,爲什麼當我試圖做第二個字節也被刪除?

回答

2

問題是,string_msg是Python 2和儘管看起來同樣是在Python 3的Unicode字符串字節字符串 - 一個字節b'\x80'是完全不同的概念從一個Unicode代碼點u'\x80':相同的Unicode碼點可以使用不同編碼中的不同字節表示,反之亦然,相同字節可以表示不同編碼中的不同字符。

如果string_msg是一個字節序列,然後使用b''文字:

data = b'\x80\x01\x00\x00\x00\x00\x53\x58\x00\x1C\x00\x00\x00\x08' 
print(":".join(map("{:02x}".format, bytearray(data)))) 
# -> 80:01:00:00:00:00:53:58:00:1c:00:00:00:08 
+0

非常感謝,它解決了這個問題。我不知道python2和python3之間的這個小差別。再次感謝。 – tonytr

0

通過編碼爲ISO 8859-1,可以將前256個字符中的文本轉換爲其無用字節值。

3>> '\x80'.encode('latin-1') 
b'\x80' 
+0

感謝您的答覆。最後,問題通過@ J.F.Sebastian提出的解決方案得到解決。具體來說,python2和python3將不同的事物(第一個作爲Unicode,第二個作爲一個字節)管理相同的變量。 – tonytr