当你抓取一个网站时,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字符实体引用,在本例中
☎
Run Code Online (Sandbox Code Playgroud)
要么
☎
Run Code Online (Sandbox Code Playgroud)
我怀疑发生的事情是你在写出字符串时没有指定编码,而Windows-1252是默认的.或者,您的浏览器可能默认设置为显示Windows-1252.
在HTML中发送数据的一个有趣的事情是你可以发送一个UTF-8字节流,将HTTP内容类型设置为UTF-8并在你的HTML文档中放置元标记,说明页面是用UTF-8编码的但是,如果最终用户使用允许他或她覆盖服务器发送的编码的浏览器,我认为有可能最终用户会错误地看到数据.
如果您使用字符实体引用,浏览器将始终正确显示它.
但是,在任何地方使用这些实体引用可能是不方便的.如今,大多数人都不会手动设置浏览器来覆盖服务器发送的编码.
附录
因此,假设您有一个unicode字符串,并且您希望生成包含HTML字符实体引用的常规(非unicode)字符串(str类型).这是一个完整的示例脚本,它说明了直接的,但不一定是最Pythonic的方法:
def to_character_entity_reference_string(s):
return "".join(["&#" + str(ord(c)) + ";" for c in s])
print(to_character_entity_reference_string(u'?????????'))
Run Code Online (Sandbox Code Playgroud)
如果您运行此脚本,则会获得输出
काठमाण्डु
Run Code Online (Sandbox Code Playgroud)
您可以将该输出放入文件并将其打开为Web浏览器,您将看到?????????按预期显示.
您可以在此基本脚本上创建变体,以便保留代码点小于128的字符,而其他所有字符都成为字符实体引用.您可能还想探索Python encode和decode函数.再一次,角色实体引用防范人们手动更改其浏览器设置以覆盖您的编码,这当然很好,但可能被认为是矫枉过正.滥用这些设置的最终用户可以说是得到了他们应得的东西,所以通常可以接受设置只是编码UTF-8中的所有内容.不过,了解字符实体引用很好.
| 归档时间: |
|
| 查看次数: |
363 次 |
| 最近记录: |