Вот небольшая программа:
#!/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)
Contrariwise, IDLE в Windows управляет выходом первой команды, но не жалуется на второе:
>>>
abcd kΩ ☠°C √Hz µF ü ☃ ♥
abcd kΩ ☠ °C √Hz µF ü ☃ ♥
IPython в командной строке Windows или через версию Python (x, y) Console2 оба замалчивают первый вывод и жалуются на второе:
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 внутри Python (x, y) Spyder делает то же самое, но по-другому:
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
на основе кодировки модуля локали, которая cp1252
для Windows 7.)
Что дает? Является ли одна из моих команд неправильной? Почему одна работает на некоторых платформах, а другая работает на других платформах? Как печатать символы Unicode последовательно без сбоев или привинчивания?
Есть ли альтернативный терминал для Windows, который ведет себя так же, как в Ubuntu? Кажется, что TCC-LE, Console2, Git Bash, PyCmd и т.д. - это всего лишь обертки для cmd.exe, а не замены. Есть ли способ запустить IPython внутри интерфейса, который использует IDLE?