【发布时间】: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(捷克语)。我怎么解决这个问题?
编辑#1:locale 命令输出
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