Python3:打印带有表情的文本,这些表情是从带有非ASCII字符的文本文件中读取的(unicode_escape)

2024-10-02 18:21:45 发布

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

我想读取包含表情符号和非ASCII字符的文本文件行,最后将它们打印出来。问题在于,我要么可以正确打印表情符号,要么可以打印非ASCII字符(例如u)

文本文件中的行(UTF-8格式):

I am tired. - Ich bin müde \U0001F4A4

代码如下:

with open(path_txt,"r", encoding="unicode_escape") as file:
    content = file.readlines()
    print(content[0])
  1. 通过encoding=“unicode_escape”,我得到了睡眠表情符号和一些“u”的神秘字符
  2. 使用encoding=“utf-8”(或默认值)打印表情符号的unicode序列\U0001F4A4和正确的“u”。 在第二种情况下\U。。。获取双转义到\U。我认为str.replace(“\U”,“\U”)可能是一种解决方法,但出现错误:

'unicodeescape' codec can't decode bytes in position 0-1: truncated \UXXXXXXXX escape

我还尝试了编码=“raw\u unicode\u escape”。 作为初学者,我不理解整个unicode主题。感谢您的帮助/解决方法

类似/相同的问题(2014年4月):https://bugs.python.org/issue21331


Tags: 方法格式asciiunicodecontentam字符utf
1条回答
网友
1楼 · 发布于 2024-10-02 18:21:45

内容似乎混合了转义符(用于表情符号)和UTF-8编码字符(用于“ü”)

从您的帖子中还不完全清楚,但我假设如果您以二进制模式(open(path, 'rb'))读取文件并打印第一行,您会看到:

b'm\xc3\xbcde \\U0001f4a4'

这意味着“ü”是用UTF-8编码的,但表情符号被转义了。 注意:您也看到了“ü”的转义序列,但这只是表示。 试试len(b'\xc3'),你会发现这实际上是一个长度为1字节的字符串^另一方面,{}实际上是一个长度为10的逃逸序列

现在,“unicode转义”序列并不期望完全是这种格式。 它将未转义的非ASCII字符解释为拉丁语-1–这就是为什么在使用此编解码器时会看到乱码字符而不是“u”:

>>> b'm\xc3\xbcde \\U0001f4a4'.decode('unicode-escape')
'müde 💤'

但是如果“unicode escape”想要拉丁语-1,我们可以给它! 首先,我们使用UTF-8解码以获得正确的“ü”:

>>> b'm\xc3\xbcde \\U0001f4a4'.decode('utf8')
'müde \\U0001f4a4'

这不涉及表情符号转义,因为它都是ASCII码。 ASCII范围内的字符对拉丁语-1和UTF-8(和ASCII)的编码相同

现在我们用拉丁语1编码:

>>> b'm\xc3\xbcde \\U0001f4a4'.decode('utf8').encode('latin1')
b'm\xfcde \\U0001f4a4'

这是“unicode转义”编解码器所理解的:

>>> b'm\xc3\xbcde \\U0001f4a4'.decode('utf8').encode('latin1').decode('unicode-escape')
'müde 💤'

在您的设置中,您可以将第一个decode步骤推迟到open()的内部处理:

with open(path_txt, "r", encoding="utf-8") as file:
    for line in file:
        line = line.encode('latin1').decode('unicode-escape')
        # do something with line

相关问题 更多 >