Python 将Unicode写入HTML文件不同于普通文件
我在用脚本写入文件时遇到了字符编码问题。我正在做的是从一个带有API的网站下载一些信息。我无法控制接收信息的格式,但这里有一个快速示例:Python 将Unicode写入HTML文件不同于普通文件,python,html,python-2.7,unicode,Python,Html,Python 2.7,Unicode,我在用脚本写入文件时遇到了字符编码问题。我正在做的是从一个带有API的网站下载一些信息。我无法控制接收信息的格式,但这里有一个快速示例: {'id': 12, 'name': "Kathy \xc3\x93 Fakename"} {'id': 23, 'name': "Se\xc3\xb1or Murphy"} (那里的名字是“凯西·法克纳姆”和“塞纳或例子”) 这基本上是好的,当我将它们写入一个没有文件类型的通用文件时,我会得到具有正确字符的正确格式 然而,我有两个问题。我正在将所有这些信息
{'id': 12, 'name': "Kathy \xc3\x93 Fakename"}
{'id': 23, 'name': "Se\xc3\xb1or Murphy"}
(那里的名字是“凯西·法克纳姆”和“塞纳或例子”)
这基本上是好的,当我将它们写入一个没有文件类型的通用文件时,我会得到具有正确字符的正确格式
然而,我有两个问题。我正在将所有这些信息写入一个html表中。当我以.html
结尾写入文件时,会将错误的字符写入文件。相反,我最终得到了名称KathyÓFakename
和SeÔ或示例
。这些不正确的字符也会显示为实际的文件名,即使我想要的更正对文件名完全有效
我相信我已经验证了唯一的区别是文件类型,尽管我仍然感到困惑,因为我不希望Python隐式地调整我所写的内容。而且它肯定在HTML的源代码中,而不仅仅是它的显示方式
要演示此代码,请执行以下操作:
with open(os.path.abspath("Test.html"),'w') as f:
for user in users:
f.write("{}: {}<br>".format(user['id'], user['name']))
with open(os.path.abspath("Test"),'w') as f:
for user in users:
f.write("{}: {}\n".format(user['id'], user['name']))
将open(os.path.abspath(“Test.html”),“w”)作为f:
对于用户中的用户:
f、 写入(“{}:{}
”。格式(用户['id'],用户['name']))
将open(os.path.abspath(“Test”),“w”)作为f:
对于用户中的用户:
f、 写入(“{}:{}\n.”格式(用户['id'],用户['name']))
导致
Test
12: Kathy Ó Fakename
23: Señor Murphy
Test.html
12: Kathy Ó Fakename<br>
23: Señor Murphy<br>
测试
12:KathyÓFakename
23:Señor Murphy
Test.html
12:KathyÓFakename
23:Señ或Murphy
造成这种差异的原因是什么?您正在写入UTF-8数据,但您用来读取文件的任何工具都将文件解码为Windows CP 1251:
>>> print "Kathy \xc3\x93 Fakename".decode('utf8')
Kathy Ó Fakename
>>> print "Kathy \xc3\x93 Fakename".decode('cp1252')
Kathy Ó Fakename
>>> print "Se\xc3\xb1or Murphy".decode('utf8')
Señor Murphy
>>> print "Se\xc3\xb1or Murphy".decode('cp1252')
Señor Murphy
使用正确的工具或告诉这些工具改用UTF-8。使用HTML时,您可以包括一个工具来告诉工具要使用什么编解码器:
凯西·法克纳姆
塞尼或墨菲
您可能想了解Python和Unicode:
- 乔尔斯波尔斯基
- 内德·巴奇尔德
>>> print "Kathy \xc3\x93 Fakename".decode('utf8')
Kathy Ó Fakename
>>> print "Kathy \xc3\x93 Fakename".decode('cp1252')
Kathy Ó Fakename
>>> print "Se\xc3\xb1or Murphy".decode('utf8')
Señor Murphy
>>> print "Se\xc3\xb1or Murphy".decode('cp1252')
Señor Murphy
使用正确的工具或告诉这些工具改用UTF-8。使用HTML时,您可以包括一个工具来告诉工具要使用什么编解码器:
凯西·法克纳姆
塞尼或墨菲
您可能想了解Python和Unicode:
- 乔尔斯波尔斯基
- 内德·巴奇尔德