【问题标题】:Python3 wrong string encodingPython3错误的字符串编码
【发布时间】:2018-03-30 22:46:27
【问题描述】:

我有一个应用程序,您可以在其中通过 SAML2 登录。我正在使用 apache mellon 模块并获取数据:

name = request.environ['MELLON_name']
email = request.environ['MELLON_mail']

根据这些数据,我使用 flask_jwt_simpe 库创建 JWT。然后我想打电话给get_jwt_identity(),但是响应的名称编码错误,它看起来JiÅí Manes而不是Jiří Manes(捷克语)。我怎么解决这个问题?

编辑#1locale 命令输出

LANG=en_US.utf8
LANGUAGE=
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=en_US.utf8

编辑#2:通过以下python代码在我的VPS上解决了它:

name = bytearray(request.environ['MELLON_name'], 'iso-8859-1').decode('utf-8')

但我想要另一个通用解决方案:-/

【问题讨论】:

  • environ 中的字符串通过环境变量传递,大概是 Apache/Mellon。它存储 UTF-8,但显然 Python/Flask 不知道这一点,因此它假定环境变量在您的默认语言环境中,这似乎是 Latin-1。因此,您需要将它们作为原始字节读取(因此您可以显式地decode('utf-8') 它们),或者您需要配置 Flask 以覆盖默认编码,或者您需要将您的系统配置为 en_US.UTF-8 或其他适当的东西。我不确定你是怎么做前两个的,但我确定它在 Flask 文档中。
  • 您可能希望添加 flask 标签以吸引常驻 Flask 专家(并明确说明您的服务器是如何启动/调度的,或者其他任何相关的内容)。
  • 如果你运行sys.getdefaultencoding(),返回什么?
  • @user3216673 当print(request.environ['MELLON_name']) 打印出原始字节时,它必须是一个字节串。它是否以b 为前缀,例如b'Ji\xc3\x85\xc2\x99\xc3\x83\xc2\xad Manes'?在那种情况下,有些事情是不对的,你不能解码字节串:bytearray(request.environ['MELLON_name'], 'iso-8859-1') 这应该会抛出一个异常。
  • print(type(request.environ['MELLON_name']))print(repr(request.environ['MELLON_name'])) 会有所帮助。

标签: python python-3.x flask character-encoding


【解决方案1】:

您已点击WSGI encoding dance。不幸的是,没有比您已经找到的更好的解决方案了。

如您所见,您已经在使用 same as werkzeug(这是 Flask 使用的 WSGI 包)来解决此问题。

如果您愿意,您可以使用该包中的兼容性函数,但您可能会发现它们在没有通知的情况下更改为私有模块,因此您最好还是坚持使用您自己的等效代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多