簡體   English   中英

python字節串編碼和解碼

[英]python byte string encode and decode

我試圖將包含非ascii字符的傳入字節字符串轉換為有效的utf-8字符串,以便我可以轉儲為json。

b = '\x80'
u8 = b.encode('utf-8')
j = json.dumps(u8)

我希望j為'\\ xc2 \\ x80',但我得到:

UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0: ordinal not in range(128)

在我的情況下,'b'來自mysql通過谷歌協議緩沖區,並填寫了一些blob數據。

有任何想法嗎?

編輯:我有一個以太網幀作為blob存儲在mysql表中(請大家,請保持主題,不要討論為什么表中有數據包)。 表格排序是utf-8,db層(sqlalchemy,non-orm)正在抓取數據並創建結構(谷歌協議緩沖區),它將blob存儲為python“str”。 在某些情況下,我直接使用協議緩沖區,沒有任何問題。 在其他情況下,我需要通過json公開相同的數據。 我注意到的是,當json.dumps()執行它的操作時,'\\ x80'可以用無效的unicode char替換(\\ ufffd iirc)

您需要檢查您正在使用的軟件API的文檔。 BLOB是首字母縮略詞: BINARY Large Object。

如果您的數據實際上是二進制的,那么將其解碼為Unicode的想法當然是無稽之談。

如果它實際上是文本,則需要知道使用哪種編碼將其解碼為Unicode。

然后你使用json.dumps(a_Python_object) ...如果你自己編碼為UTF-8, json會再次解碼它:

>>> import json
>>> json.dumps(u"\u0100\u0404")
'"\\u0100\\u0404"'
>>> json.dumps(u"\u0100\u0404".encode('utf8'))
'"\\u0100\\u0404"'
>>>

關於latin1更新:

u'\\x80'是一個無用的無意義的C1控制字符 - 編碼極不可能是Latin-1。 Latin-1是“陷阱和妄想” - 所有8位字節都被解碼為Unicode而不會引發異常。 不要混淆“作品”和“不引起異常”。

使用b.decode('name of source encoding')獲取unicode版本。 當我學到它時,這對我來說是令人驚訝的。 例如:

In [123]: 'foo'.decode('latin-1')
Out[123]: u'foo'

我想你要做的是解碼一些編碼的字符串對象。 你知道編碼是什么嗎? 獲取unicode對象。

unicode_b = b.decode('some_encoding')

然后使用utf_8編碼將unicode對象重新編碼回字符串對象。

b = unicode_b.encode('utf_8')

使用unicode對象作為翻譯器,不知道字符串的原始編碼是什么,我無法確定,但轉換可能不會按預期進行。 unicode對象不用於將一種編碼的字符串轉換為另一種編碼。 假設您知道編碼是什么,我會使用unicode對象,如果您不知道編碼是什么,那么在沒有試驗和錯誤的情況下確實沒有找到方法,然后轉換回編碼的字符串時你想要一個字符串對象。

暫無
暫無

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

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