【问题标题】:Writing Unicode to HTML File Differs from Plain File将 Unicode 写入 HTML 文件与普通文件不同
【发布时间】:2015-07-22 10:59:41
【问题描述】:

我在使用脚本写入文件时遇到字符编码问题。我正在做的是从带有 API 的网站下载一些信息。我无法控制接收信息的格式,但这里有一个快速示例:

{'id': 12, 'name': "Kathy \xc3\x93 Fakename"}
{'id': 23, 'name': "Se\xc3\xb1or Murphy"}

(名字有“Kathy Ó Fakename”和“Señor Example”)

这基本没问题,当我将这些写入没有文件类型的通用文件时,我会以正确的格式和正确的字符获取它们。

但是我有两个问题。我正在将所有这些信息写入一个 html 表。当我以.html 结尾写入文件时,错误的字符被写入文件。相反,我最终得到了Kathy Ó FakenameSeñor Example 的名称。这些不正确的字符也显示为实际的文件名,即使我想要的更正对文件名完全有效。

我相信我验证了唯一的区别是文件类型,尽管我仍然感到困惑,因为我没想到 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']))

结果

Test
12: Kathy Ó Fakename
23: Señor Murphy

Test.html
12: Kathy Ó Fakename<br>
23: Señor Murphy<br>

是什么导致了这里的差异?

【问题讨论】:

  • 您正在编写 UTF-8,但如果您使用需要拉丁 1 或 Windows 代码页 1251 的工具打开文件,那么是的,您将看到 Mojibake
  • @PadraicCunningham:看看标签。 :-)

标签: python html python-2.7 unicode


【解决方案1】:

您正在写入 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 时,您可以包含 meta tag 来告诉工具使用什么编解码器:

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  </head>
  <body>
     Kathy Ó Fakename<br />
     Señor Murphy<br />
  </body>
</html>

您可能想了解 Python 和 Unicode:

【讨论】:

  • 我觉得自己很愚蠢,我没有想到我还在浏览器中查看 HTML 源代码而不是 Notepad++(我正在查看纯文件)。所以这正是我的错误,谢谢!
猜你喜欢
  • 2018-01-28
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
相关资源
最近更新 更多