python - 将查询字符串中的十六进制传递给 Python
问题描述
我有一种情况,我想将查询字符串中的十六进制值传递给用 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'
我究竟做错了什么 ?是我打印的方式吗?
解决方案
当您尝试将某些内容转换为 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 文档中。
推荐阅读
- python - 计算 HDF5 数据的均值和标准差
- formatting - 在任意两种不同格式之间转换消息
- javascript - 注册时突变返回 null
- php - 使用 Laravel 对 API 的 http 地址的 HTTP 请求
- r - for循环中的Textplot并向绘图添加描述
- css - 如何在纯 CSS 中使颜色变深?
- powershell - 无法从 PowerShell 中的路径获取子字符串
- excel - 按标题合并 Excel 列
- javascript - 嵌入 XSLT 时出现 Jscript 错误 - 对象不支持此属性或方法
- python - 如何跨多个节点使用 mpi4py 发送数据?