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])
- 使用 encoding="unicode_escape" 我得到了睡眠表情符号和一些神秘的“ü”字符。
- 使用 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
我想读取包含表情符号和非 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])
- 使用 encoding="unicode_escape" 我得到了睡眠表情符号和一些神秘的“ü”字符。
- 使用 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