簡體   English   中英

python 2字節字符串,未在utf-8中編碼

[英]python 2 byte string that are not encoded in utf-8

我維護了一個可以從多種語言輸入文本的API。 我們想將字符串編碼為utf-8

以前的開發人員嘗試過的大多數解決方案都涉及使用編碼和解碼功能willy nilly。 這只會導致混亂的無法維護的代碼。

為了簡單起見,我僅在此處定義x ,但可以想象一下它可以發送到我的api。 該字符串編碼為latin-1

x = '\xe9toile' # x is a byte string in python 2
x.encode('utf-8')

結果是

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

我知道將其編碼為utf-8的唯一方法是先將其解碼為latin-1然后再進行編碼。

x.decode('latin-1')
>>u'\xe9toile'
(x.decode('latin-1')).encode('utf-8')
>>'\xc3\xa9toile'

如果我不知道字節串是用latin-1編碼的,那我怎么能將其編碼為utf-8呢?

如果x是我不知道的中文編碼,該怎么辦?

x = '\u54c8\u54c8'

x始終是字節字符串。 任何幫助,將不勝感激。

如果x是一個字節字符串,那么對它進行編碼就沒有意義。 文本編碼是一種將文本表示為字節的方法。 您首先必須通過解碼將字節轉換為文本,然后將該文本編碼為目標編碼。

如果我不知道字節串是用latin-1編碼的,那我怎么能將其編碼為utf-8呢?

您可以嘗試猜測編碼,但不一定總是正確的:

>>> 'Vlh'.encode('cp037')
'\xe5\x93\x88'
>>> '哈'.encode('utf-8')
'\xe5\x93\x88'

這個例子是有點做作,但也沒有辦法知道,如果字節'\\xe5\\x93\\x88'代表Vlh ,除非你知道原始編碼。

最明智的解決方案是只讓您的客戶端將其文本編碼為UTF-8,然后對收到的字節解碼為UTF-8。

暫無
暫無

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

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