Передача hex в строке запроса в Python - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть ситуация, когда я хочу передать шестнадцатеричное значение в строке запроса к коду сервера, написанному на Python.Я видел этот ответ URL выглядит (если я хочу, чтобы b содержал 0x80):

www.example.com / page? A = 10 & b =% 80

Я сделал следующие шаги в Python (я хочу напечатать и проверить, могу ли я получить 0x80):

#!/usr/bin/python3

import cgitb
import urllib.parse
import os

cgitb.enable()

# Print necessary headers.
print("Content-Type: text/html")
print()

query = os.environ.get('QUERY_STRING')
query = urllib.parse.unquote(query)
# Not able to use print(query) -- throws error
query_print = query.encode('utf-8')
print(query_print)

Я получаю следующий вывод:

b'a=10&b=\xef\xbf\xbd' 

Что я делаю неправильно ?Я так печатаю?

1 Ответ

0 голосов
/ 15 февраля 2019

Когда вы пытаетесь преобразовать что-либо в 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 .

...