Кажется, что содержимое состоит из некоторой смеси escape-символов (для эмодзи) и символов в кодировке UTF-8 (для "ü").
Это не совсем ясно из вашего поста, но я предполагаю, если вы прочитаете файл в двоичном режиме (open(path, 'rb')
) и напечатаете первую строку, вы увидите это:
b'm\xc3\xbcde \\U0001f4a4'
Это означает, что «ü» был закодирован в UTF-8, но смайлики сбежал. Примечание. Вы также видите escape-последовательности для «ü», но это только представление. Попробуйте len(b'\xc3')
, и вы увидите, что на самом деле это строка длиной 1 байт. b'\\U0001f4a4'
с другой стороны - действительно escape-последовательность длиной 10.
Теперь последовательность «unicode-escape» не ожидает именно этого формата. Он интерпретирует неэкранированные не-ASCII символы как Latin-1 - поэтому при использовании этого кода вы видите искаженные символы вместо «ü» c:
>>> 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 кодируются одинаково для Latin-1 и UTF-8 (и ASCII).
Теперь мы кодируем с Latin-1:
>>> b'm\xc3\xbcde \\U0001f4a4'.decode('utf8').encode('latin1')
b'm\xfcde \\U0001f4a4'
, и это что-то " Unicode-escape "код c понимает:
>>> 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