【问题标题】:Python: Unicode encoding different between Mac and UbuntuPython:Mac和Ubuntu之间的Unicode编码不同
【发布时间】: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


【解决方案1】:

如果您希望这个 Unicode 韩语输出:

Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
>>> print u"30\uc77c \uc774\uc6a9\uad8c"
30일 이용권

那么我认为导致错误输出的唯一原因是您的终端没有使用 UTF-8。

但是话又说回来,如果 OS X 给你“30\uc77c\uc774\uc6a9\uad8c”,它似乎并没有做得更好(除非你能够从基本的多语言平面读取两个八位字节码点(这将是非常令人印象深刻的))。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-24
    • 2013-12-08
    • 2020-08-26
    • 1970-01-01
    • 2018-05-27
    • 2010-11-08
    • 2019-09-08
    • 1970-01-01
    相关资源
    最近更新 更多