在Python中解码/编码html转义的特殊字符

2024-06-07 15:54:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些包含html转义码的文本,我正在努力完全解码/编码以使用Python正确显示(最终在Django应用程序中)

""Coup d'État""是一个麻烦的片段

我已经使用html.unescape()成功地取消了大部分html代码的扫描,但是在本例中,我正在努力解码特殊字符"É"。理想情况下,这将显示为“Coup d'eatat”,但尽管尝试了一些解码/编码组合,我还是得到了“Coup d'eatat”

""Coup d'État""转换为"Coup d'État"的正确方法是什么

感谢您的帮助,如果在其他地方得到答复,请道歉。我试过搜索,但没有成功


Tags: django代码文本应用程序编码html解码coup
1条回答
网友
1楼 · 发布于 2024-06-07 15:54:28

您有一个Mojibake,双重编码的数据。您不仅拥有HTML实体,而且在应用HTML实体之前,您的数据被错误地从字节解码为文本

例如,两个É实体解码为Unicode字符Ã。这两个字符(根据Unicode标准)也被称为U+00C3 LATIN CAPITAL LETTER A WITH TILDEU+2030 PER MILLE SIGN。这是典型的UTF-8数据被错误解释为拉丁变体编码(如ISO 8859-1Windows Latin codepage variant)的情况

如果我们假设原始字符是ÉU+00C9 LATIN CAPITAL LETTER E WITH ACUTE,那么如果使用UTF-8,原始字符将被编码为C389字节这里显示的是不是巧合,UTF-8->;拉丁变体Mojibakes的典型结果就是这样的组合。89映射告诉我们,最可能的错误编码是Windows CP 1252 encoding,它将十六进制值89映射到U+2030 PER MILLE SIGN

您可以手动编码为字节,然后作为正确的编码进行解码,但诀窍是要知道错误使用了什么编码,有时这种错误会导致数据丢失,因为CP-1252代码页没有针对5个特定字节值的Unicode字符映射。这不是您的任务中的示例的直接问题离子,但可以用于其他文本。手动解码的工作方式如下:

>>> import html
>>> broken = ""Coup d'État""
>>> html.unescape(broken)
'"Coup d\'État"'
>>> html.unescape(broken).encode("cp1252")
b'"Coup d\'\xc3\x89tat"'
>>> html.unescape(broken).encode("cp1252").decode("utf-8")
'"Coup d\'État"'

一个更好的选择是使用特殊的^{} library(这个名字是的首字母缩略词,Fixed That for You),它使用关于如何识别此类错误和修复损坏的详细知识

ftfy还处理HTML实体解码,全部在一个步骤中完成:

>>> import ftfy
>>> ftfy.fix_text(""Coup d'État"")
'"Coup d\'État"'

该库包括sloppy variants of text codes often found in a Mojibake以帮助修复。它还编码有关如何识别给定错误编解码器选择产生的特定错误的信息,以便知道如何扭转损坏

相关问题 更多 >

    热门问题