2016-12-14 4 views
-1

Я не могу правильно кодировать и декодировать строку, содержащую одинарные и двойные кавычки. Примечание. Мне нужно показать кавычки.Кодировать/декодировать строку с кавычками

Я сохранил следующую строку в txt-файле.

Here’s their mantra: “Eat less and exercise more. The secret to weight loss is energy balance. There are no good or bad calories. It’s all about moderation.” 

with open ("file.txt", "r") as myfile: 
    data = myfile.read() 
    myfile.close() 

print data 
the result: 
 
HereΓÇÖs their mantra: ΓÇ£Eat less and exercise more. The secret to weight loss is energy balance. There are no good or bad calories. ItΓÇÖs all about moderation.ΓÇ¥ 

я могу полностью опустить кавычки, но мне нужно, чтобы показать им

print data.decode('ascii', 'ignore') 

Heres their mantra: Eat less and exercise more. The secret to weight loss is energy balance. There are no good or bad calories. Its all about moderation. 

print json.dumps(data) 

"\ufeff\nHere\u2019s their mantra: \u201cEat less and exercise more. The secret to weight loss is energy balance. There are no good or bad calories. It\u2019s all about moderation.\u201d " 
+0

Консоль или терминальное кодирование не поддерживает UTF-8 (кодирование вашего входного файла). Вместо этого консоль использует cp437. –

+0

Итак, что мне делать? –

+2

Что вы * стараетесь делать? Ваша консольная кодировка не поддерживает «причудливые» цитаты в тексте; вы можете заменить их эквивалентами ASCII или изменить кодировку консоли. –

ответ

2

Ваш файл не ASCII. Вы, кажется, понимаете это, потому что вы явно сказали ему игнорировать ошибки декодирования.

Похоже, что файл является UTF-8, и Python печатает кодировку UTF-8 в unicode объекта, Windows, затем интерпретируя через кодовую страницу по умолчанию консоли (на моей системе, cp437, в ASCII надмножеству, что предоставляет кучу символов рисования консоли как символ). Для того, чтобы исправить, расшифровать его правильно:

print data.decode('utf-8') 

В качестве альтернативы, вы можете использовать open функцию Python 3, даже в Python 2.7, путем импорта io и использование io.open, который позволит вам указать кодировку и выполнять декодирование для вас автоматически и легко:

from __future__ import print_function # Including the __future__ import makes 
             # this 100% Py2/Py3 compatible 
import io 

with io.open("file.txt", encoding="utf-8") as myfile: 
    data = myfile.read() 
print(data) 

Если вы на Windows, ваша командная строка, вероятно, не будет поддерживать произвольный вывод Unicode, к сожалению, и нет 100% решение, но работает

chcp 65001 

в вашем запросе cmd.exe перед запуском программы Python заставит использовать UTF-8 в качестве «кодовой страницы» консоли (как он интерпретирует вывод необработанных байтов на Python). Есть ошибки с этой кодовой страницей (поиск, чтобы узнать больше), но это самое близкое, что вы собираетесь получить. Вам также нужен шрифт консоли Unicode, more details here.

Альтернативное решение для манипулирования мануальными кодовыми страницами (или переход на Python 3.6, который полностью обходит проблемы с кодовой страницей) заключается в использовании пакета, такого как unidecode, для преобразования символов, отличных от ASCII, в их эквиваленты ASCII (так что кодовые слова Unicode становятся простые ASCII прямые цитаты). Существует много информации об использовании unidecode, доступной в другом месте, и я избегу ругаться здесь.

+0

проблема по-прежнему сохраняется. –

+0

При этом вы получите UnicodeEncodeError, потому что их консоль настроена для CP437. –

+0

@AnayBose: нет, вы получаете * другую * ошибку сейчас. Это не та же проблема. –

Смежные вопросы