【问题标题】:Python bottle requests and unicodePython 瓶子请求和 unicode
【发布时间】:2015-02-10 11:44:44
【问题描述】:

我正在用 python 中的瓶子构建一个小型 RESTful API,目前在处理请求对象时遇到字符编码问题。

点击http://server.com/api?q=äöü 并查看服务器上的request.query['q'] 让我得到“äöü”,这显然不是我想要的。

对于包含表单 urlencoded 键 q 和值 äöü 的 POST 请求也是如此。 request.forms.get('q') 包含“äöü”。

这里发生了什么?我真的没有选择用不同的编码解码这些元素,还是我?瓶子是否有一个通用的选项来将这些存储在 unicode 中?

谢谢。

【问题讨论】:

    标签: python unicode bottle


    【解决方案1】:

    request.query['q']forms.get('q') 返回 Web 浏览器提交的原始字节值。浏览器以 UTF-8 编码字节提交的值 äöü'\xc3\xa4\xc3\xb6\xc3\xbc'

    如果您打印该字节字符串,并且您打印它的位置将其解释为 ISO-8859-1 或类似的 Windows 代码页 1252,您将获得äöü。如果您通过打印到 Windows 命令提示符或记事本显示的文件进行调试,这就是原因。

    如果您使用 alternative direct property access request.query.qforms.q,Bottle 将为您提供 Unicode 字符串,使用 UTF-8 从字节版本解码。通常最好尽可能使用这些 Unicode 字符串。 (尽管您可能仍然无法将它们打印到控制台。众所周知,Windows 命令提示符在处理非 ASCII 字符方面非常糟糕,因此是调试 Unicode 问题的坏地方。)

    【讨论】:

    • 我不知道像这样的直接属性访问是可能的。谢谢!
    • 必须使用字典的形式来搜索非标准的属性被发送POST。还有另一种选择 与 request.POST.question_10request.POST ["question_10"] 不同?
    • 如果您需要读取具有非标识符或动态名称的属性,您始终可以将getattr 与任何其他对象一起使用。例如getattr(forms, 'q')
    【解决方案2】:

    在这种情况下,要转换它,我确实喜欢这个 search_field.encode("ISO-8859-1").decode("utf-8")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 2016-12-24
      相关资源
      最近更新 更多