Вот небольшая программа:
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
print('abcd kΩ ☠ °C √Hz µF ü ☃ ♥')
print(u'abcd kΩ ☠ °C √Hz µF ü ☃ ♥')
На Ubuntu, терминал Gnome, IPython делает то, что я ожидал:
In [6]: run Unicodetest.py
abcd kΩ ☠ °C √Hz µF ü ☃ ♥
abcd kΩ ☠ °C √Hz µF ü ☃ ♥
Я получаю тот же вывод, если я ввожу команды на trypython.org.
codepad. org, с другой стороны, выдает ошибку для второй команды:
abcd kΩ ☠ °C √Hz µF ü ☃ ♥
Traceback (most recent call last):
Line 6, in <module>
print(u'abcd kΩ ☠ °C √Hz µF ü ☃ ♥')
UnicodeEncodeError: 'ascii' codec can't encode character u'\u03a9' in position 6: ordinal not in range(128)
И наоборот, IDLE в Windows искажает вывод первой команды, но не жалуется на вторую:
>>>
abcd kΩ ☠°C √Hz µF ü ☃ ♥
abcd kΩ ☠ °C √Hz µF ü ☃ ♥
IPython в командной строке Windows или через Console2 версии Python(x,y) оба искажают первый вывод и жалуются на второй:
In [9]: run Unicodetest.py
abcd kΩ ☠ °C √Hz µF ü ☃ ♥
ERROR: An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line statement', (15, 0))
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (most recent call last)
Desktop\Unicodetest.py in <module>()
4 print('abcd kΩ ☠ °C √Hz µF ü ☃ ♥')
5
----> 6 print(u'abcd kΩ ☠ °C √Hz µF ü ☃ ♥')
7
8
C:\Python27\lib\encodings\cp437.pyc in encode(self, input, errors)
10
11 def encode(self,input,errors='strict'):
---> 12 return codecs.charmap_encode(input,errors,encoding_map)
13
14 def decode(self,input,errors='strict'):
UnicodeEncodeError: 'charmap' codec can't encode character u'\u2620' in position 8: character maps to <undefined>
WARNING: Failure executing file: <Unicodetest.py>
IPython внутри Spyder Python(x,y) делает то же самое, но по-другому:
In [8]: run Unicodetest.py
abcd kΩ ☠°C √Hz µF ü ☃ ♥
------------------------------------------------------------
Traceback (most recent call last):
File "Unicodetest.py", line 6, in <module>
print(u'abcd kΩ ☠°C √Hz µF ü ☃ ♥')
File "C:\Python26\lib\encodings\cp1252.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_table)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u03a9' in position 6: character maps to <undefined>
WARNING: Failure executing file: <Unicodetest.py>
(В sitecustomize. py, Spyder устанавливает свою собственную SPYDER_ENCODING
на основе кодировки модуля locale, которая для Windows 7 равна cp1252
.)
Что дает? Одна из моих команд неправильная? Почему одна работает на одних платформах, а другая - на других? Как печатать символы Unicode последовательно, без сбоев и ошибок?
Есть ли альтернативный терминал для Windows, который ведет себя так же, как в Ubuntu? Кажется, что TCC-LE, Console2, Git Bash, PyCmd и т.д. - это просто обертки для cmd.exe, а не замена. Есть ли способ запустить IPython внутри интерфейса, который использует IDLE?