2010-12-06 86 views
0

我正在使用python-memcached庫檢索由memcached中的另一個應用程序設置的值。但不幸的是這是我得到的值:Python將混合ASCII碼轉換爲字符串

>>> mc.get("key") 
'\x04\x08"\nHello' 

是否有可能來解析這種混合的ASCII碼爲使用python功能純字符串?

您的幫助感謝堆

回答

7

「純弦」,給這樣的事情存在的程度。我不知道你期待什麼樣的輸出,但是:

有沒有像純文本這樣的東西。

Python(在2.x中,無論如何)str類型實際上是一個字節容器,而不是字符。所以它不是真正的文本:)它顯示的字節假設一個非常簡單的編碼,使用轉義序列來表示每個字節,甚至有點「怪異」。如果你的字符串是print(你現在看到的是在你的代碼中創建這樣一個文字字符串的語法),它將被格式化爲不同的格式。

在更簡單的時候,我們天真地認爲我們可以將字節映射到我們稱之爲「字符」的這些符號,那就是這樣。然後,事實證明,人們想要使用大約幾十億種不同的映射,並且它們中的大多數需要比字節能夠表示的更多的符號。這就是爲什麼我們現在使用Unicode:它代表您可以想象到的任何現實世界語言所需的所有符號(以及幾種用於假語言和其他目的),並且它將數字抽象地分配給這些符號,但不會說明如何收集並將這些字節解釋爲數字。 (這是編碼的目的)。

如果您知道字符串數據是以特定方式編碼的,則可以將其解碼爲Unicode字符串。它可以是實際Unicode數據的編碼,也可以是其他格式的文本(例如,日文文本常常被稱爲「Shift-JIS」,因爲它與「Latin-JIS」具有幾乎相同的意義) 1「 - ASCII的常見擴展名 - 對我們來說)。無論哪種方式,您都會獲得一系列Unicode代碼點的內存中表示(前一段中提到的數字)。這一點,對於所有意圖和目的,是真正的「文字」,但它是不是真正的「純」 :)

但它看起來像你的數據確實是個字節的二進制BLOB,僅僅發生到如果解釋爲ASCII,則主要由「可讀文本」組成。

你真的需要做的是找出爲什麼第一個字節的值是4,下一個字節的值是8,並相應地進行處理。

1

如果你只需要修剪'\x04\x08"\n',它總是相同的(你有沒有把你的問題很清楚,我不能肯定,如果這就是它是什麼或什麼你想要的),做這樣的事情:

to_trim = '\x04\x08"\n' 
string = mc.get('key') 
if string.startswith(to_trim): 
    string = string[len(to_trim):] 
+0

因爲必須在切片索引符號中使用整數,所以應將'string = string [to_trim:]'更改爲string = string [len(to_trim):]。或者,如果string.startswith()子句只是調用string = string.replace(to_trim,'')作爲to_trim包含應該從所有位置刪除的垃圾字符,而不是。 – 2010-12-06 14:35:48

+0

@ jimbob:真的,我的意思是,但當我在這裏重新輸入時,我錯過了len()部分。 – 2010-12-06 22:14:34