在网页报废期间,我得到了unicode中的字符\ u260e。我的输出是“The Last Resort,â€+977 1 4700525”。所以不应该,而应该是☎。
如何将其恢复到电话号码(☎)?因此输出将是“The Last Resort,☎+ 977 1 4700525”。
Krish
答案 0 :(得分:8)
当您抓取网站时,Python识别出一个“☎”字符并将其存储在字符串中。
此角色的代码点为260e。但是,当存储字符时,它们将存储为一个或多个字节的序列。这些字节取决于所使用的编码。在你的情况下,可能使用了UTF-8。
此角色的UTF-8编码为E2 98 8E(参见http://www.fileformat.info/info/unicode/char/260e/index.htm)。
所以现在你有一个代表你角色的字节序列。你打算用它做什么?你打算把它输出到某个地方。但是希望将此字节字符串转换为字符,因此您必须指定编码。假设您指定编码Windows-1252(请参阅http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT)。
这就是你所看到的。你需要用UTF-8写出你的Python字符串。或者,如果您正在写HTML,请使用DruvPathak建议使用HTML字符实体引用,在这种情况下
☎
或
☎
我怀疑发生的事情是你在写出字符串时没有指定编码,而Windows-1252是默认的。或者,您的浏览器可能默认设置为显示Windows-1252。
在HTML中发送数据的一个有趣的事情是你可以发送一个UTF-8字节流,将HTTP内容类型设置为UTF-8,并在你的HTML文档中放置元标记,说明页面是以UTF-8,但如果最终用户使用允许他或她覆盖服务器发送的编码的浏览器,我认为有可能最终用户会错误地看到数据。
如果您使用字符实体引用,浏览器将始终正确显示它。
但是,在任何地方使用这些实体引用可能不方便。如今,大多数人都没有手动设置浏览器来覆盖服务器发送的编码。<强>附录强>
因此,假设您有一个unicode字符串,并且您希望生成包含HTML字符实体引用的常规(非unicode)字符串(类型str )。这是一个完整的示例脚本,它说明了直接的,但不一定是最恐怖的方式:
def to_character_entity_reference_string(s):
return "".join(["&#" + str(ord(c)) + ";" for c in s])
print(to_character_entity_reference_string(u'काठमाण्डु'))
如果您运行此脚本,则会获得输出
काठमाण्डु
您可以将该输出放入文件并在Web浏览器中打开,您会看到काठमाण्डु
按预期显示。
您可以在此基本脚本上创建变体,以便保留代码点小于128的字符,而其他所有字符都成为字符实体引用。您可能还想探索Python的encode
和decode
函数。再一次,角色实体引用防范人们手动更改其浏览器设置以覆盖您的编码,这当然很好,但可能被认为是矫枉过正。滥用这些设置的最终用户可以说是得到了他们应得的东西,所以通常可以接受设置只是编码UTF-8中的所有内容。不过,了解字符实体引用很好。
答案 1 :(得分:1)
您可以使用具有给定代码的HTML实体在结果页面中打印它们。
例如: http://www.danshort.com/HTMLentities/index.php?w=dingb
或者使用string.encode函数以所需的编码对其进行编码。