使用引号对字符串进行编码/解码

时间:2016-12-14 14:43:54

标签: python

我无法正确编码和解码包含单引号和双引号的字符串。注意:我需要显示引号。

我在txt文件中保存了以下字符串。

testB=

我可以完全省略引号,但我需要显示它们

Here’s their mantra: “Eat less and exercise more. The secret to weight loss is energy balance. There are no good or bad calories. It’s all about moderation.” 

with open ("file.txt", "r") as myfile:
    data = myfile.read()
    myfile.close()

print data
the result:

HereΓÇÖs their mantra: ΓÇ£Eat less and exercise more. The secret to weight loss is energy balance. There are no good or bad calories. ItΓÇÖs all about moderation.ΓÇ¥ 

1 个答案:

答案 0 :(得分:2)

您的文件不是ASCII。你似乎意识到这一点,因为你明确告诉它忽略解码错误。

看起来文件是UTF-8,Python正在打印unicode对象的UTF-8编码,Windows然后通过控制台的默认代码页解析(在我的系统上) ,cp437,一个ASCII超集,提供一组控制台绘图符号作为字符)。要修复,请正确解码:

print data.decode('utf-8')

或者,您可以使用Python 3 open函数,即使在Python 2.7中,也可以导入io并使用io.open,这将允许您指定编码并为您执行解码自动无缝地:

from __future__ import print_function  # Including the __future__ import makes
                                       # this 100% Py2/Py3 compatible
import io

with io.open("file.txt", encoding="utf-8") as myfile:
    data = myfile.read()
print(data)

如果您使用的是Windows,那么您的命令提示可能不会支持任意Unicode输出,并且没有100%的解决方案,但正在运行

chcp 65001
在启动Python程序之前,在cmd.exe提示中

将使用UTF-8作为控制台"代码页" (它如何解释Python输出的原始字节)。该代码页存在错误(搜索以了解更多信息),但它是您最接近的代码。您还需要一个Unicode友好的控制台字体more details here

手动代码页操作(或迁移到Python 3.6,完全绕过代码页问题)的另一种解决方案是使用像unidecode这样的包将非ASCII字符转换为它们的ASCII等价物(所以Unicode智能引号成为纯ASCII直引号)。有很多关于在其他地方使用unidecode的信息,我会避免在这里反刍。