【问题标题】:Flask-Admin: UnicodeDecodeError: 'ascii' codec can't decode byteFlask-Admin:UnicodeDecodeError:“ascii”编解码器无法解码字节
【发布时间】:2013-08-19 16:53:15
【问题描述】:
我正在尝试使用 flask-admin 为我的应用程序构建一个后端接口。
当我尝试访问表单以创建新条目时,我得到:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 13: ordinal not in range(128)
通过堆栈跟踪,问题是我的表中的某些项目包含非 ascii 字符。我该如何解决这个问题?
谢谢!
【问题讨论】:
标签:
python
unicode
encoding
flask
flask-admin
【解决方案1】:
一些遗留代码也遇到了同样的问题。每当您:
- 使用 Python 2,并且
- 通过
str(而不是unicode)对象表示非ASCII数据,并且
- 您的 Python 系统编码是
ascii(大多数情况下都是这样)。
第二个问题可能源于 SQLAlchemy String 列在你应该有 Unicode 的地方,或者是在你应该写 'u'šömething'' 的时候写 'šömething' - 它通常可能很难确定问题的实际根源。
然而,很容易通过方程的hacking the third component 来解决它(不过通常是not recommended)。在代码中的某处添加这些行应该可以解决问题(通过将实际问题隐藏在地毯下):
import sys
reload(sys)
sys.setdefaultencoding('UTF8')
【解决方案2】:
你应该使用unicode字符串,就像这样
u"whaterver string"
【解决方案3】:
一般来说,这个错误是通过使用unicode.encode()方法强制字符串数组为unicode来解决的。
来自主题的Python Wiki页面
>>> u"a".encode("utf-8")
'a'
>>> u"\u0411".encode("utf-8")
'\xd0\x91'
>>> "a".encode("utf-8") # Unexpected argument type.
'a'
>>> "\xd0\x91".encode("utf-8") # Unexpected argument type.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128)
我想最好的解决方法是修改负责字段格式的 jinja 宏以强制将值转换为 unicode。