Помогите понять, почему Unicode работает только иногда в Python

Вот небольшая программа:

#!/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?

11
задан endolith 19 April 2011 в 16:19
поделиться