Какой формат кодирования для чтения надстрочного (NG²) и латинского-1 в Python? - PullRequest
0 голосов
/ 28 мая 2018

Я использую, чтобы читать латинский плейлист из spotify скриптом python (2.7).До сих пор латинский-1 работал нормально.

Но потом я встретил имя типа NG², из-за которого оно не работало.Больше.

Это сообщение об ошибке:

...
Solo Fue Una Noche;NG²;Comienzos;9;2004 (printed by a print() cmd)
Traceback (most recent call last):
  File "get_playlist-tracks.py", line 110, in <module>
    ndt.write(line+"\n").encode('latin-1')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 21-22: ordinal not in range(128)

Думаю, мне нужен код комбинации для латинского-1 и верхнего индекса.Это правильно, и кто-нибудь знает, какой из них будет правильным?


Спасибо за многочисленные ответы!Ну, это немного сложнее:

(Между тем) У меня есть 3 установки Win10 (64-битная) (WinA, WinB, WinC).На WinA (самый старый, 2011, перенесенный с Win7) все работает нормально (Python3.4)На winB и WinC (новейшая версия HW, Python3.6) curl cmd получает код выхода 1,никто не знает, какого черта.Поскольку я хочу избавиться от старого WinA и продолжить использовать свои скрипты на python, я просто пробую скрипты нагость Fedora20 в VMWare Player12.Теперь эта проблема с верхним индексом есть только в системе Fedora(не на WinA - WinB и WinC больше не имеют для меня никакого смысла из-за проблемы с завитками).

Я использую следующие первые две строки в скрипте:

#!/usr/bin/python3.3
# -*- coding: utf-8 -*-

Ошибка появляется, только когда я пытаюсь записать эту строку (с верхним индексом 2) в файл:

print (line)         # (works fine!)
ndt.write(line+"\n") # (this one not!)

Я попытался написать команду также с .decode ('utf-8') и .decode ('latin-1')но всегда я получаю одно и то же сообщение ...

Затем я попробовал следующее в консоли python:

>>> line="Solo Fue Una Noche;NG²;Comienzos;9;2004"
>>> playlist_name = '/home/.../Python/PLLs/Sole_01a_tracks.txt'
>>> ndt = open(playlist_name, 'w')
>>> ndt.write(line+"\n").decode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute 'decode'
>>> ndt.write(line+"\n")
40
>>> line
'Solo Fue Una Noche;NG²;Comienzos;9;2004'
>>> playlist_name
'/home/.../Python/PLLs/Sole_01a_tracks.txt'
>>> ndt.write(line)
39

код

print ("playlist_contents_file:", playlist_name)

распечатывает:

('playlist_contents_file:', u'/home/.../Python/PLLs/Sole_01a_tracks.txt')

1 Ответ

0 голосов
/ 28 мая 2018

Проблема не в верхнем индексе 2. Это символ латинского 1 \xb2, и вам не нужна другая кодировка.Проблема в том, что вы вызываете encode() для строки байтов, которая уже является Latin-1.

Во-первых, поймите, что encode() принимает строку Unicode и превращает ее в некоторое представление, которое отображает значения байтов в Unicode. кодовыеПоэтому, чтобы использовать его, вы должны вызывать его в строке Unicode.Если вы вызываете encode() для обычной строки, Python пытается сначала привести ее к Unicode.

Поскольку это Python 2, ваша исходная строка (line) представляет собой строку байтов, которая не может бытьнадежно приведен к Unicode, если вы не скажете ему, что такое кодировка.Если вы этого не сделаете и выберете принуждение по умолчанию, Python предполагает ascii.

Таким образом, вам нужно декодировать из latin-1, чтобы получить Unicode:

>>> line="Solo Fue Una Noche;NG²;Comienzos;9;2004"
>>> line
'Solo Fue Una Noche;NG\xb2;Comienzos;9;2004'
>>> line.decode('latin-1')
u'Solo Fue Una Noche;NG\xb2;Comienzos;9;2004'

В этом случае Unicode и Latin-1 случаются чтобы иметь такое же 8-битное представление вашего не-ascii символа.Но это просто удобная случайность.Это может быть иначе, поэтому вы должны указать декодирование.Теперь у вас есть строка Unicode, к которой вы можете добавить '\n':

>>> line.decode('latin-1')+"\n"
u'Solo Fue Una Noche;NG\xb2;Comienzos;9;2004\n'

Затем вы можете кодировать эту строку Unicode обратно в Latin-1 для вывода:

>>> (line.decode('latin-1')+"\n").encode('latin-1')
'Solo Fue Una Noche;NG\xb2;Comienzos;9;2004\n'

Но для того, что вы делаете, вам совсем не нужно encode().Вы говорите, что получаете Latin-1 от Spotify.Вы хотите, чтобы ваш вывод был Latin-1.Таким образом, вы можете просто добавить "\n" к вашей входной строке и записать ее.

>>> line="Solo Fue Una Noche;NG²;Comienzos;9;2004"
>>> line + "\n"
'Solo Fue Una Noche;NG\xb2;Comienzos;9;2004\n'
>>> ndt.write(line+"\n")
...