【问题标题】:Python/HTML - Accented characters not rendering properly in browserPython/HTML - 重音字符无法在浏览器中正确呈现
【发布时间】:2013-07-13 00:32:42
【问题描述】:

我正在尝试从维基百科的 API 中获取一个页面,并使用 Python 将该页面打印到一个文件中。

json_data = json.loads(issue_request(params_html))
document = json_data['parse']['text']['*'].encode('utf-8')
a = open('test.html', 'wb')
a.write(document)

我发出的请求是发给http://pt.wikipedia.org/w/api.php?action=parse&prop=text&page=Dia_dos_Namorados&format=json

问题是,当我在浏览器中打开“test.html”时,所有重音字符都呈现不正确,所以我看到类似:Dia de São Valentim。

我尝试了各种不同的编码方案,包括编码为“latin-1”或使用编解码器,但到目前为止都没有奏效。有趣的是,如果我在文本编辑器(崇高)中打开文件,重音字符显示正常。只是在浏览器中它们看起来很有趣。

【问题讨论】:

  • 您的文本编辑器可能默认为 UTF-8。 (如果您使用的是 Mac 或最新的 Linux 发行版,那是您的系统默认设置,所以 大多数 应用程序可能会使用它。)这并没有告诉您哪些程序没有默认设置将显示为 UTF-8。
  • 将编码更改为“utf-16”似乎可以解决它。谢谢大家,我现在对根本问题有了更好的理解。
  • 您并没有真正修复任何东西,您只是选择了浏览器能够猜到的编码。 (这可能意味着您的浏览器是 Internet Explorer,对吧?)

标签: python html character-encoding non-ascii-characters


【解决方案1】:

您正在将 HTML 片段保存为 UTF-8。

通常,您可以通过在 HTTP 标头或 HTML 标头中使用 Content-Type 来指定 HTML 文档的字符集。但是您没有 HTTP(它只是一个文件)或 HTML 头部分(它只是一个片段),所以也没有办法。所以,你的浏览器必须猜测。

在这种情况下,大多数浏览器将默认使用 Latin-1,尽管有些浏览器会使用您的系统字符集,或者提供一种配置方式,或者甚至会尝试神奇地猜测。无论如何,如果您的浏览器尝试将 UTF-8 显示为 Latin-1,您最终会得到如下内容:

Esta página ou secção foi marcada para revisão, ...

您的浏览器可能有一种方法可以覆盖页面的默认字符集。例如,使用 Safari,转到查看菜单,然后是文本编码,然后选择 UTF-8,然后:

Esta página ou secção foi marcada para revisão, …


那么,如何永久修复它?

嗯,你不能真正永久地修复它,因为没有正确的方法将非 ASCII 数据存储在 HTML 片段中。事实上,从技术上讲,浏览器甚至不应该将这样的 HTML 片段显示为文档。

但是,许多浏览器会让您在片段的最顶部添加<meta> 标签。所以,这可能只是一个问题:

a.write('<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">')
a.write(document)

但这并不适用于所有浏览器,也不应该适用;它只是发生在他们中的许多人身上。

应该合法的是将片段包装在文档中。这可以像这样简单:

a.write('''<!DOCTYPE html>
    <html>
    <head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"></head>
    <body>{}</body>
    </html>'''.format(document))

最好弄清楚页面是用哪个 HTML 版本编写的,并使用适当的文档类型。但这应该足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    相关资源
    最近更新 更多