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

Python3: print text with emojis read from text-file with non ASCII-characters (unicode_escape)

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

文本文件中的行(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" 我得到了睡眠表情符号和一些神秘的“ü”字符。
  2. 使用 encoding="utf-8"(或默认),它会打印表情符号的 unicode 序列 \U0001F4A4 和正确的“ü”。 在第二种情况下,\U... 被双重转义为 \U。我认为 str.replace("\U", "\U") 可能是一种解决方法,但错误:

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

我也试过编码="raw_unicode_escape"。 作为初学者,我不理解整个 unicode 主题。感谢您的 help/workarounds!!

Similar/Same 这里的问题 (04/2014):https://bugs.python.org/issue21331

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

从您的 post 中还不完全清楚,但我假设如果您以二进制模式 (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() 的内部处理:

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