Когда вы пытаетесь преобразовать что-либо в utf-8, могут возникнуть некоторые проблемы, потому что некоторые последовательности байтов не являются допустимыми символами UTF-8.Например b'\x80'.decode()
броски и ошибка.Когда Python кодирует / декодирует некоторые последовательности байтов, вы можете указать, что должно произойти, когда он достигнет некоторой недопустимой последовательности.urllib.parse.unquote()
по умолчанию используется для этого подхода, называемого replace
.Подход replace
просто заменяет каждый байт в недопустимой последовательности на U+FFFD
, что в байтах эквивалентно 0xEF 0xBF 0xBD
.
Существует другой способ и использовать подход, называемый surrogateescape
, который отображает недопустимые байты в действительные символы UTF-8 (U + DC80 в U + DCFF), а затем при кодировании в байты может преобразовать эти символы обратно.к оригинальным байтам.Вот код с таким подходом:
#!/usr/bin/python3
import cgitb
import urllib.parse
import os
cgitb.enable()
# Print necessary headers.
print("Content-Type: text/html")
print()
query = "page?a=10&b=%80"
query = urllib.parse.unquote(query, errors="surrogateescape")
query_print = query.encode('utf-8', 'surrogateescape')
print(query_print)
Полная документация по обработке ошибок кодирования / декодирования находится в Документация Python .