【问题标题】:Trouble converting UTF-8 string to XML/HTML string将 UTF-8 字符串转换为 XML/HTML 字符串时遇到问题
【发布时间】:2020-02-13 23:23:25
【问题描述】:

我有一个以 UTF-8 编码的字符串,我正在尝试在网页上显示该文本。我注意到我将任何特殊字符转换为 XML 编码字符的任何尝试都是失败的。我知道我做错了什么,但我不知道如何改正。

编辑:原来的问题只显示以下字符串为一个没有b前缀的字符串,没有注意与str()的转换。以下是未显示的更新转换过程。

这是我正在使用的示例字符串,它的末尾有一个水平省略号:

>>> html = b'<p>Lorem ipsum dolor sit amet\\xe2\\x80\\xa6</p>'
>>> html = str(html)

我的问题是 UTF-8 字符的长度可变,所以我不能这样做:

>>> import re
>>> re.sub(r'\\(x[a-f\d]{2})', r'&#\1;', html) # Don't do this!
'<p>Lorem ipsum dolor sit amet&#xe2;&#x80;&#xa6;</p>'

这给出了三个完全有效的 UTF-8 扩展字符,但不是正确的编码。就我而言,我可以简单地这样做:

>>> re.sub(r'\\xe2\\x80\\xa6', '&hellip;', html)
'<p>Lorem ipsum dolor sit amet&hellip;</p>'

但这仅涵盖许多字符编码中的一种。我显然没有时间、耐心或任何意图为每个字符编写替换。

所以,我的问题是:如何判断字符的字节长度?是否有一些字节掩码可以用来判断一个字节是字符的第一个字节还是最后一个字节?欢迎使用任何其他确定长度的方法,或者可以为我完成的模块。

【问题讨论】:

  • 我使用的是 3.5 版
  • 我收到它们是这样的;它不在我的控制之下。
  • 其实这并不准确。我将其作为字节前缀字符串接收并使用str() 进行转换。
  • 谢谢,我想我让自己的事情变得更复杂了,不是吗?将此作为答案与您的链接一起发布,我将在今天晚些时候标记为已接受。

标签: python html character-encoding


【解决方案1】:

正在以 UTF8 编码的bytes 接收 html。通过像这样解码字节可以将它们转换为str

html = bytes_string.decode('utf-8')

或者像这样

html = str(bytes_string, 'utf-8')

执行str(bytes_string) 不会解码字节,它会返回字节的repr

解码后,可以使用标准库中 html.entities 模块和 str.translate 中的数据将字符转换为等效的 html 实体。

from html import entities                                                                                                                                                  

# If we don;t want to convert html tags, don't include
# '<' and '>' in the translation table.                                                                                                                                                                               
skip = {ord(x) for x in '<>'}                                                                                                                                              
trans_table = {k: '&{};'.format(v) 
               for k, v in entities.codepoint2name.items() if k not in skip}                                                                           

translated = s.translate(trans_table)                                                                                                                                      
print(translated)

输出

<p>Lorem ipsum dolor sit amet&hellip;</p>

我在this answer 中更深入地讨论了翻译的工作原理。

【讨论】:

    猜你喜欢
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    相关资源
    最近更新 更多