【问题标题】:Passing hex in query string to Python将查询字符串中的十六进制传递给 Python
【发布时间】:2019-02-15 08:00:18
【问题描述】:

我有一种情况,我想将查询字符串中的十六进制值传递给用 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' 

我做错了什么?是我打印的方式吗?

【问题讨论】:

  • 抛出什么异常?
  • @KristiyanGospodinov: UnicodeEncodeError: 'ascii' codec can't encode character '\\ufffd' in position 7: ordinal not in range(128)

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


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 2014-05-01
    • 2023-04-08
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    相关资源
    最近更新 更多