Python3:使用从非ASCII字符(unicode_escape)的文本文件中读取的表情符号打印文本

问题描述 投票:0回答:1

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

文本文件中的行(采用UTF-8格式:]

我很累。 -Ich binmüde\ U0001F4A4

要读取的代码:

with open(path_txt,"r", encoding="unicode_escape") as file:
    content = file.readlines()
    print(content[0])
  1. With encoding =“ unicode_escape”,我得到了睡眠表情符号和一些隐喻的字符“ü”。
  2. 使用encoding =“ utf-8”(或默认设置),它会为表情符号和正确的“ü”打印Unicode序列\ U0001F4A4。在第二种情况下,\ U ...两次转义到\ U。我是str.replace(“ \ U”,“ \ U”)可以解决,但错误:

'unicodeescape'编解码器无法解码位置0-1中的字节:截断的\ UXXXXXXXX转义

我还尝试了encoding =“ raw_unicode_escape”。作为一个初学者,我不了解整个unicode主题。感谢您的帮助/解决方法!

此处类似/相同问题(04/2014):https://bugs.python.org/issue21331

python unicode encoding codec
1个回答
0
投票

似乎内容是转义符(对于表情符号)和UTF-8编码字符(对于“ü”而言)。

从您的帖子中还不清楚,但是我认为如果您将以二进制模式(open(path, 'rb'))读取文件并打印第一行,将会看到以下内容:

b'm\xc3\xbcde \\U0001f4a4'

这意味着“ü”是用UTF-8编码的,但表情符号已转义。注意:您也可以看到“ü”的转义序列,但这仅是表示形式。尝试len(b'\xc3'),您会发现这实际上是一个长度为1个字节的字符串。另一方面,b'\\U0001f4a4'实际上是长度为10的转义序列。

现在,“ unicode-escape”序列并不完全希望这种格式。它将未转义的非ASCII字符解释为Latin-1-这就是为什么在使用此编解码器时看到乱码而不是“ü”的原因:

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

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

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

这不涉及表情符号转义符,因为它全为ASCII。ASCII范围内的字符对Latin-1和UTF-8(当然也包括ASCII)进行了相同的编码。

现在我们使用Latin-1编码:

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

这是“ unicode-escape”编解码器理解的东西:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.