2016-02-23 3 views
0

Если я бегу codeКак я могу выводить unicode в буфер сообщений emacs?

# -*- coding: utf-8 -*- 
month = "März" 
print month.decode("utf-8") 

в OS X терминала, я получаю строку März просто отлично.

Кроме того, мои emacs (24,5 на OS X 10.10), похоже, обрабатывают unicode (или, по крайней мере, умлауты) просто отлично, так как я вижу умлаут в моем окне emacs.

Тем не менее, когда я запускаю выше код непосредственно из Emacs я получаю:

Traceback (most recent call last): 
    File "unicode-umlaut.py", line 3, in <module> 
    print month.decode("utf-8") 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 1: ordinal not in range(128) 

Что это значит? Означает ли это, что хотя emacs обрабатывает символ latin-1, буфер сообщений emacs отказывается обрабатывать unicode? Есть ли исправление, позволяющее выводить символы не-ascii в буфер сообщений в emacs?

Update:

побайтно файл выглядит (через Emacs Hexl-режиме), как это:

00000000: 2320 2d2a 2d20 636f 6469 6e67 3a20 7574 # -*- coding: ut 
00000010: 662d 3820 2d2a 2d0a 6d6f 6e74 6820 3d20 f-8 -*-.month = 
00000020: 224d c3a4 727a 220a 7072 696e 7420 6d6f "M..rz".print mo 
00000030: 6e74 682e 6465 636f 6465 2822 7574 662d nth.decode("utf- 
00000040: 3822 290a        8"). 

В c3a4 карты к-умляут (а), и поэтому файл похоже, правильно закодирован в UTF-8.

ответ

0

Это:

# -*- coding: utf-8 -*- 
month = "März" 
print month.decode("utf-8") 

более просто:

# -*- coding: utf-8 -*- 
month = u"März" # Use a Unicode string! 
print month 

#coding: utf8 объявляет кодировку исходного файла, поэтому убедитесь, что ваш редактор настроен, чтобы сохранить файл в этом формате.

Первый способ сломался при запуске на терминале, не настроенном для UTF-8; второй будет работать на терминале, настроенном для любой кодировки, которая поддерживает символ ä.

Сообщение об ошибке вы Показанное month уже Unicode, поэтому Python 2 пытается кодировать его по умолчанию ascii Кодек перед декодированием его обратно в Unicode с utf8 кодека. Это означает, что вы не используете тот же код, что и выше, поскольку этот код использует байтовую строку.

+0

Я не совсем уверен, что понимаю. Вы подозреваете, что кодировка файла неверна. Теперь я добавил шестнадцатеричный дамп файла. Не подтверждает ли это, что файл правильно закодирован в UTF-8? – Calaf

+0

Да, это выглядит хорошо. Другая возможность заключается в том, что ваш терминал ожидает одну кодировку, но ваша конфигурация терминала неправильно сообщает об этом Python. Какова ценность переменной среды LANG? –