2016-04-05 2 views
0

У меня есть строка, возвращенное Elasticsearch:Python - Рендер Юникода коды при печати

\n\nESM Management LLC (\u201cESM\u201d) provides investment 

При печати строки, строка представлена ​​так, как показано выше. Я пробовал расшифровать, т. Е. s.decode('utf8'), но я думаю, что есть что-то фундаментальное, я не понимаю о процессе кодирования/декодирования.

Как преобразовать эту строку, чтобы визуализировать новые строки, а коды Юникода преобразуются в символы, которые они представляют?

Это то, что я ищу:

.>>> s = '\n\nESM Management LLC (\u201cESM\u201d) provides investment' 
.>>> s 
. 
. 
.ESM Management LLC ("ESM") provides investment 
+0

Отображается ли вывод в окне терминала? Если да, то какой набор символов настроен для отображения терминала? Возможно, у него нет символов, которые вы хотите, поэтому он возвращается к использованию числовых кодов. –

+0

То же поведение в iTerm 2.9 и Sublime Text 3. Кодирование символов iTerm: Unicode (UTF-8). Тип терминала отчета: xterm-256color – chishaku

+0

Проверьте, действительно ли вы печатаете (т. Е. Используете оператор печати) или просто эхом в REPL, как в вашем примере. Это имеет отношение к ответу. – wim

ответ

1

Похоже, вы используете Python 2.

  1. Использовать Юникод для таких литералов.
  2. Кодировать в кодировку stdout, чтобы убедиться, что она напечатана правильно.

-

import sys 

s = u'\n\nESM Management LLC (\u201cESM\u201d) provides investment' 
print s.encode(sys.stdout.encoding) 


ESM Management LLC (“ESM”) provides investment 

Если, как вы говорите на дне это байты строки откуда-то еще, вы не можете использовать юникод буквальным. Вместо этого декодируйте, используя 'unicode-scape'.

s = '\n\nESM Management LLC (\u201cESM\u201d) provides investment' 
print s.decode(encoding='unicode-escape').encode(sys.stdout.encoding) 


ESM Management LLC (“ESM”) provides investment 

EDIT Как @wim объясняет в комментарии кодирования как sys.stdout.encoding, вероятно, не требуется, так как print будет делать это в любом случае. Возможно, потребуется дополнительное декодирование OTOH в зависимости от кодировки терминала и оболочки, но я не уверен, что именно нужно сделать. Поэтому я оставлю ответ так, как он помог OP. См. this excelent answer для получения дополнительной информации по этой теме.

+0

нет, нет, нет ... все это решения для групповой помощи. – wim

+0

Хотя я признаю свою ошибку в отношении кодирования перед индексированием документов, второе решение удовлетворило мою непосредственную необходимость. Теперь мне не нужно повторно индексировать эти 200k-документы, чтобы получить результаты сегодня. Спасибо @Goyo. – chishaku

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