字串變數有時包含需要取消八進制的八進制字符。示例:oct_var = "String\302\240with\302\240octals", 的值oct_var應"String with octals"包含不間斷空格。
編解碼器不支持八進制,我沒能找到一個有效的解決方案encode()。字串起源于我無法控制的上游。
蟒蛇 3.9.8
編輯添加:它不必擴展或超快,所以也許這里(#6)的想法可以作業(尚未測驗):
def decode(encoded):
for octc in (c for c in re.findall(r'\\(\d{3})', encoded)):
encoded = encoded.replace(r'\%s' % octc, chr(int(octc, 8)))
return encoded.decode('utf8')
uj5u.com熱心網友回復:
您忘記指出oct_var應以位元組形式給出:
>>> oct_var = b"String\302\240with\302\240octals"
>>> oct_var.decode()
'String\xa0with\xa0octals'
>>> print(oct_var.decode())
String with octals
注意:如果您的值已經是一個字串(超出您的控制范圍),您可以嘗試將其轉換為位元組:
>>> oct_str = "String\302\240with\302\240octals" # as a string
>>> oct_var = bytes([ord(c) for c in oct_str])
# often equivalent to:
>>> oct_var = oct_str.encode('Latin1')
然后按照上面的步驟進行。
請注意,如果字串還包含 ASCII 以外的字符(例如,使用 Latin1,重音字符如 'é'),則后續.decode()將失敗,如在 UTF-8 中,這些字符表示為多位元組字符(例如'é'.encode() == b'\xc3\xa9', but 'é'.encode('Latin1') == b'\xe9')。如果字串包含超出 Latin1 的 Unicode 字符(例如 '你好'),您將得到 aValueError或 a UnicodeEncodeError,具體取決于您選擇的兩種轉換方法中的哪一種)。
簡而言之:不要飛任何昂貴、沉重或有人在里面飛的東西——這太糟糕了。至少,用try ... except (ValueError, UnicodeEncodeError, UnicodeDecodeError)這些例外包圍你的代碼并相應地處理這些例外。
uj5u.com熱心網友回復:
將您的想法和指標放在一起,以及使用未記錄的函式[*]帶來的風險,即codecs.escape_decode,這條線有效:
value = (codecs.escape_decode(bytes(oct_var, "latin-1"))[0].decode("utf-8"))
[*]“內部函式意味著:你可以冒險使用它,但可以在任何 Python 版本中更改甚至洗掉該函式。”
的解釋codecs.escape_decode:
https://stackoverflow.com/a/37059682/5309571
其使用示例:
https://www.programcreek.com/python/example/8498/codecs.escape_decode
其他可能比codecs.escape_decode(沒有保證,我沒有嘗試過)更具前瞻性的方法:
https://stackoverflow.com/a/58829514/5309571
https://bytes.com/topic/python/answers/743965-converting-octal-escaped-utf-8-a
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/393393.html
