【发布时间】:2012-12-31 07:41:03
【问题描述】:
我有一个小的 Python 程序,它从文件中读取 SQL 语句并在 MySQL 数据库上运行它们。该文件以 UTF-8 编码,数据库也使用 UTF-8。
如果我没有设置数据库编码,我会收到每个人都问的关于“'latin-1'编解码器无法编码字符......”的常见错误。所以我设置数据库和文件编码使用
con.set_character_set('utf8')
fh = codecs.open(fname,'r','utf8')
现在它可以工作了,但是当我不设置文件编码(或仅使用内置打开)时,它也可以工作,只是在数据库中。 “工作”是指生成的数据库记录在假定 UTF-8 的 WordPress 中正确显示。
如果我想要魔法,我会用 Ruby 编写代码。在这种情况下,Python 在做什么?为什么不需要告诉它文件编码?
不用说我已经对此进行了很多搜索,而且我的 Google-foo 通常都不错。这里和博客中有大量关于为什么需要设置编码以及如何设置编码的帖子,但我没有找到任何关于它为什么有时会起作用的信息。
编辑: 我使用包含“谢谢”的文件对此进行了简单的测试。
file
E2 80 9C 54 68 61 6E 6B 20 79 6F 75 2E E2 80 9D
codecs utf8
201C 54 68 61 6E 6B 20 79 6F 75 2E 201D
尝试使用 codecs.open(myfile,'r','ascii') 读取它返回“UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2”
从文件中读取产生了一个字节字符串,所以看起来魔法正在发生在插入数据库中。
【问题讨论】:
-
除了将文件内容提供给 MySQL 之外,您还对文件的内容做任何事情吗? Python 可以正常读取 UTF8 格式的旧文件。根据我的经验,当您尝试将其写回时,通常会出现通常的“latin-1 编解码器无法编码”错误。
-
我将生成的数据库提供给假设它是 UTF8 的 WordPress。当它正常工作时,文本会正确显示,当它不正常时,文本会显示很多奇怪的字符。 “用常规的旧打开方式阅读它就很好”让我感到困惑,因为我认为默认编码是 ISO 8859-1。
-
@anov,谢谢,我在问题中添加了“作品”的定义。
标签: python unicode python-2.7 mysql-python codec