Преобразование символов с помощью Python

#python #utf-8

#python #utf-8

Вопрос:

Я получаю текстовый файл, но некоторые символы в нем неверны.

Одним из примеров является текст ниже:

 Apresentação/ divulgação do curso
  

Но правильный текст

 Apresentação/ divulgação do curso
  

Я использую Php-функцию utf8_decode, и она работает, смотрите пример ниже

 echo utf8_decode("Apresentação/ divulgação do curso");
result Apresentação/ divulgação do curso
  

но я не могу заставить это работать на Python, я пытаюсь использовать

 my_str = 'Apresentação/ divulgação do curso'
print( my_str.decode("utf-8") )
  

Но я получил следующую ошибку:

 AttributeError: 'str' object has no attribute 'decode'
  

Как я могу заставить это работать на Python?

Комментарии:

1. Можете ли вы показать код, в котором вы получаете эту строку? Например. путем открытия указанного текстового файла.

2. Я получаю текст из файла csv

Ответ №1:

Строка является результатом декодирования необработанных байтов UTF-8 как latin-1 . Поэтому просто перекодируйте их как latin-1 , затем декодируйте как utf-8 :

 >>> my_str = 'Apresentação/ divulgação do curso'
>>> print( my_str.encode('latin-1').decode("utf-8") )
Apresentação/ divulgação do curso
  

Если это происходит из файла, который вы open редактировали на Python, вы, вероятно, использовали latin-1 (или аналогичный cp1252 ) в качестве кодировки по умолчанию для open . В этом случае правильное решение — предоставить правильную кодировку open , чтобы она в первую очередь была правильно декодирована, изменив что-то вроде:

 with open('myfile.txt') as f:
    my_str = f.read()
  

Для:

 with open('myfile.txt', encoding='utf-8') as f:
    my_str = f.read()
  

таким образом, никаких дополнительных encode или decode шагов не требуется.

Ответ №2:

Я думаю, что исходный текст находится в iso-8859-1. Это исправит это:

 >>> s = 'Apresentação/ divulgação do curso'
>>> bytes(s, 'iso-8859-1').decode('utf-8')
'Apresentação/ divulgação do curso'
  

Комментарии:

1. Текст изначально был в UTF-8, но кто-то (код операционной системы?) Изначально ошибочно декодировал его с использованием ISO-8859-1.