【问题标题】:Python 3 character encoding issuePython 3 字符编码问题
【发布时间】:2017-11-22 07:22:54
【问题描述】:

我正在从 MySQL // Maria DB 中选择值,该数据库包含带有 latin1_swedish_ci 排序规则的 latin1 字符集。可能有来自不同欧洲语言的字符,如西班牙语 ñ、德语 ä 或挪威语 ø。

我用

获取数据
#!/usr/bin/env python3
# coding: utf-8

...
sql.execute("SELECT name FROM myTab")
for row in sql
 print(row[0])

有一个错误信息: UnicodeEncodeError: 'ascii' 编解码器无法编码字符 '\xf1' 好的,我已将打印更改为

print(str(row[0].encode('utf8')))

结果如下所示: b'\xc3\xb1' 我看了这个Working with utf-8 encoding in Python source,但我已经声明了标题。 decode('utf8').encode('cp1250') 也无济于事

【问题讨论】:

标签: python-3.x encoding utf-8 character-encoding iso-8859-1


【解决方案1】:

好的,编码问题终于解决了。 Coldspeed 给了一个重要的后跟 loacle。因此,所有的荣誉对他!不幸的是,这并不容易。

我找到了解决问题的解决方法。

import sys
sys.stdout = open(sys.stdout.fileno(), mode='w', encoding='utf8', buffering=1)

解决方案来自Jack O'Connor。发表于this answer:

【讨论】:

  • +1 因为这让我能够继续前进。但是,这不应该写在像docs.python.org/3/howto/unicode.html 这样的地方顶部的闪光灯上吗?我的问题与使用 jinja2 模板有关。在模板不包含任何 unicode 的情况下,一切正常,但是,一旦模板中某处有单个 unicode 字符,它就会中断。我的系统语言环境是“en_US.UTF-8”,没有多少编码/解码解决了这个问题。但以上只是感觉如此基本的东西,它不可能是“正确的方法”?
  • 一千次!这怎么不是 2018 年的默认设置:/
【解决方案2】:

Python3 尝试根据您的语言环境设置自动解码此字符串。如果您的语言环境与字符串上的编码不匹配,则会出现乱码,或者根本不起作用。您可以强制尝试使用您的语言环境对其进行编码,然后解码为cp1252(似乎这是字符串上的编码)。

print(row[0].encode('latin-1').decode('cp1252'))

【讨论】:

  • 似乎区域设置指向目标。不幸的是,您的方法仍然没有带来正确的解决方案。但随着语言环境,我越来越近了。
  • @JoePlatano row[0].encode('latin-1').decode('utf-8') 怎么样?
  • no 不起作用,如果我将脚本作为 python script.py 执行,它可以在 shell 上运行。在网络服务器上没有。我在 shell 中添加了以下行print(sys.stdout.encoding)print(sys.getdefaultencoding()),两者都有 utf-8。如果我在浏览器上执行脚本,sys.stdout.encoding 有 ANSI_X3.4-1968,sys.getdefaultencoding() 有 utf-8。我认为 apache 存在一些语言环境问题
  • @JoePlatano 哦,我明白了……恐怕我在这里不知所措。希望你弄清楚!您应该尝试不同的编码,看看哪种有效。
  • 是的,谢谢你把我推向一个好的方向!因此赞成。谢谢朋友
猜你喜欢
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 2012-02-22
  • 2012-05-29
  • 2015-01-20
  • 1970-01-01
相关资源
最近更新 更多