【发布时间】:2014-09-07 18:36:11
【问题描述】:
当我使用 tornado 3.2.2 开发 WAS 服务器时,
我将系统从 Mac 更改为 Ubuntu 后遇到一些 unicode 问题。
Mac 环境下可以正常使用。
但是,相同的数据库(远程 MySQL 服务器),相同的源代码,它显示不同
ubuntu 下的结果。
这两者之间唯一不同的是操作系统(mac和ubuntu 14.04)
和python版本(mac:2.7.8,ubuntu:2.7.6)
在 Mac 下,它显示正确的结果,如下所示
"remark": "30\uc77c \uc774\uc6a9\uad8c"
但是在ubuntu下却是这样的
"remark": "30? ???"
这两天我一直在尝试做我在网上找到的所有事情。
但我找不到原因。
我已经尝试了各种编码/解码方法,如下所示:
print(type(test_dict["remark"]))
print(test_dict["remark"].encode("utf-8").decode("euc-kr"))
print(test_dict["remark"].decode("utf-8").encode("euc-kr"))
print(test_dict["remark"].encode("euc-kr").decode("utf-8"))
print(test_dict["remark"].decode("euc-kr").encode("utf-8"))
print(unicode(test_dict["remark"], 'utf-8'))
encoding = chardet.detect(test_dict["remark"])
print(encoding)
print(test_dict["remark"].decode("unicode-escape"))
print(unicode(test_dict["remark"], "utf-8"))
print(unicode(test_dict["remark"], "utf-8").decode("utf-8").encode("utf-8"))
print(unicode(test_dict["remark"], "utf-8").encode("utf-8").decode("utf-8"))
for c in test_dict["remark"]:
if c not in string.ascii_letters:
print(" not ascii")
else:
print("ascii")
print(test_dict["remark"].decode(encoding["encoding"]).encode("utf-8"))
print(test_dict["remark"].encode("utf-8"))
print(test_dict["remark"].decode("utf-8").encode("euc-kr"))
print(unicode(test_dict["remark"].decode("utf-8").encode("utf-8")))
还有 tornado.escape 方法。
但结果还是错了。
Ubuntu下的结果如下:
<type 'str'>
30? ???
30? ???
30? ???
30? ???
30? ???
{'confidence': 1.0, 'encoding': 'ascii'}
30? ???
30? ???
30? ???
30? ???
not ascii
not ascii
not ascii
not ascii
not ascii
not ascii
not ascii
30? ???
30? ???
30? ???
30? ???
不允许将区域设置更改为 euc-kr
我的语言环境设置如下
苹果机
LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL="en_US.UTF-8"
Ubuntu
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
我在测试时发现了一些奇怪的东西......
在代码下,两个系统看起来不一样
encoding = chardet.detect(test_dict["remark"])
在Mac
下{'confidence': 0.938125, 'encoding': 'utf-8'}
在 Ubuntu
下{'confidence': 1.0, 'encoding': 'ascii'}
有人知道为什么会这样吗?
任何想法或建议都会非常感谢我。
提前谢谢你
【问题讨论】:
-
如果你真的在那里看到那些问号,那么数据就会损坏。
-
我解决了上述问题。这不是任何编码问题。解决方案是我如何连接到数据库。我刚刚在连接 MySQL 时添加了 ?charset=utf8 就我而言,我使用 SQLAlchemy 进行连接,所以我添加了它工作正常谢谢大家
标签: python macos ubuntu unicode tornado