繁体   English   中英

Python 不读取 unicode U + FE0F

[英]Python does not read unicode U + FE0F

假设我将 WhatsApp 聊天导出为 .txt,然后用 python 读取它。 似乎 python 没有为包含 \️ 的表情符号读取正确的 unicode 组合。 例如彩虹旗表情符号🏳️‍🌈是 U+1F3F3 U+FE0F U+200D U+1F308。 但是,如果我用 python 读取文件,使用下面的代码,标志 emoji 被读取为 \\U0001f3f3\‍\\U0001f308。 我的代码有问题吗? WhatsApp导出的文件是否不正确? 还是有其他原因导致这种行为如此?

我想编写一个程序来查找聊天中的所有表情符号,但是 \\U0001f3f3\‍\\U0001f308 不是现有的表情符号,所以我现在收到错误...

def showchat():
    f = open("MyChat.txt", "r")
    lines = f.readlines()
    for l in lines:
        print(l)
        print(str(l.encode('unicode-escape')))
    f.close()

WhatsApp 似乎以 UTF-8 格式导出他们的文件。 因此,您必须在open文件时设置该编码:

f = open("MyChat.txt", "r", encoding="utf-8")

您的 Python 安装可能已经默认为 UTF-8,因为当您的程序尝试读取文件时您没有收到错误消息。 由于'\️'是一个特殊的 Unicode 代码点,不代表实际字符,它可能无法被 WhatsApp 正确导出。 您需要对文件进行十六进制转储以确定它实际包含的内容。

这是一个老问题,但值得解释发生了什么。 问题不在于 Python。 它甚至可能不是 Whatsapp,它可能是用户用来输入表情符号的键盘软件。


彩虹旗的书写方式有两种。 查看来自 Unicode 的emoji-test.txt文件(在此处找到):

1F3F3 FE0F 200D 1F308                                  ; fully-qualified     # 🏳️‍🌈 E4.0 rainbow flag
1F3F3 200D 1F308                                       ; unqualified         # 🏳‍🌈 E4.0 rainbow flag

第一种方式是您期望的方式,第二种方式是 Whatsapp 正在生成的方式。 第一种方式是完全合格的,而第二种方式是不合格的。 您可以在此处找到这些术语的定义,但基本上完全限定意味着包含所有推荐的代码点。 在这种情况下,这意味着FE0F存在,它明确告诉渲染器这个表情符号应该以图形方式显示,而不是像 ☺ 这样的文本格式。

不合格的格式不应该出现,键盘永远不应该生成它们。 但是几乎所有的渲染器,比如你的浏览器、字体、Whatsapp,都会将它们渲染为表情符号,因为它有助于保持工作正常并看起来不错,以防出现不合格的表情符号。

一般来说,像您这样解析未知输入的软件应该支持表情符号的所有三种变体(完全、最低限度和不合格),因此您应该更改代码以将这两个彩虹旗表情符号识别为有效。

有关更多信息,您可以查看 Unicode Emoji Implementation Notes以及我之前的链接。 如果您还没有,您还想了解零宽度连接器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM