2012-08-13 263 views
0

我有此字符串"\x00\x12\xf8\x05\x74\xa2",和以下結果:逃逸UTF8解碼(「 X74」到「T」)

>>> s = "\x00\x12\xf8\x05\x74\xa2" 
>>> s 
'\x00\x12\xf8\x05t\xa2' 
>>> print s 
?t? 
>>> print repr(s) 
'\x00\x12\xf8\x05t\xa2' 


>>> s = r"\x00\x12\xf8\x05\x74\xa2" <=== (I want this result but cannot use r'') 
>>> s 
'\\x00\\x12\\xf8\\x05\\x74\\xa2' 
>>> print s 
\x00\x12\xf8\x05\x74\xa2 

你可以看到該串中的'\x74'被轉化成相應的utf8字符't'自動在上半場輸出。我實際上有一個自定義字典來解碼,所以我不想這個自動轉換。

如果我可以在後半部分輸出中保留與r'string'相同的字符串,那將是最好的。顯然repr不起作用,有沒有其他方法可以做到這一點?

更新:我想要這個,因爲我需要將每個\xhh中的hh轉換爲int數。

在此先感謝。

+1

你想通過這個解決什麼問題? – Daenyth 2012-08-13 16:35:10

+0

如果你的意圖是逐字節地使用字符串,那麼不管它如何回顯給你,它都會有相同的內部表示。如果你想瀏覽你看到的字符,而不使用'r',那麼你需要手動轉義每個反斜槓 – 2012-08-13 16:37:25

+0

@Daenyth我需要將'\ xhh'中的每個十六進制'hh'映射到int。使用'int('\ xhh',16)無法工作。 – Yulong 2012-08-13 16:40:46

回答

3

更新:我想要這個,因爲我需要在每個\ xhh中將hh轉換爲 int數。

>>> s = "\x00\x12\xf8\x05\x74\xa2" 
>>> [ord(x) for x in list(s)] 
[0, 18, 248, 5, 116, 162] 
+1

啊,問你真正想要什麼而不是你想要的東西的力量。當然,現在的答案根本不符合問題的標題。 – 2012-08-13 17:06:12

+0

@MarkRansom對於混淆抱歉。下一次我會堅持標題。 – Yulong 2012-08-16 15:44:06

1

您可以手動創建所需的表示是這樣的:

>>> s = '\x00\x12\xf8\x05\x74\xa2' 
>>> r = ''.join(['\\x%02x' % ord(b) for b in s]) 
>>> r 
'\\x00\\x12\\xf8\\x05\\x74\\xa2' 
>>> print r 
\x00\x12\xf8\x05\x74\xa2 

根據您的更新,如果你只是想ord值,撕裂了一小塊我原來的答覆的:

>>> [ord(b) for b in s] 
[0, 18, 248, 5, 116, 162] 
3

我想這是因爲我需要在每一個\ XHH HH轉換爲INT 號。

In [17]: s = "\x00\x12\xf8\x05\x74\xa2" 

In [18]: list(bytearray(s)) 
Out[18]: [0, 18, 248, 5, 116, 162] 

This article上的ByteArray用途可能是你的興趣。