将查询字符串中的十六进制传递给Python

时间:2019-02-15 08:00:19

标签: python python-3.x query-string

我遇到一种情况,我想将查询字符串中的十六进制值传递给用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 :(得分:1)

当您尝试将某些内容转换为utf-8时,可能会遇到一些问题,因为某些字节序列不是有效的UTF-8符号。例如,b'\x80'.decode()引发错误。当Python编码/解码某些字节序列时,您可以指定当遇到某些无效序列时应该发生什么。 urllib.parse.unquote()默认用于此错误方法,称为replacereplace方法仅将无效序列中的每个字节替换为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 documentation中提供了有关编码/解码错误处理的完整文档。