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

Часто, когда я работаю интерактивно в IDLE, я хотел бы вставить строку Unicode в окно IDLE. Кажется, что оно вставляется правильно, но немедленно генерирует ошибку. У него нет проблем с отображением того же символа на выходе.

>>> c = u'ĉ' Unsupported characters in input >>> print u'\u0109' ĉ 

Я подозреваю, что окно ввода, как и большинство программ Windows, использует UTF-16 внутренне и не имеет проблем с полным набором Unicode; проблема заключается в том, что IDLE настаивает на принуждении ко всем входным данным кодовой странице mbcs по умолчанию, и все, что не на этой странице, отклоняется.

Есть ли способ сконфигурировать или уговорить IDLE принять полный набор символов Юникода в качестве входных данных?

Python 3.2 справляется с этим намного лучше и не имеет проблем с чем-либо, что я бросаю в него.

Я знаю, что могу просто сохранить код в файл в UTF-8 и импортировать его, но я хочу иметь возможность работать с символами Unicode в интерактивном окне.

  • Python raw_input испортил конкатенацию строк
  • Установка модуля Swampy Python в Windows
  • Python & XAMPP для Windows: как?
  • Python: как убить дочерний процесс (ы), когда родитель умирает?
  • 32-разрядные ограничения памяти Python на 64-битных окнах
  • Как я могу остановить csv.DictWriter.writerows Python от добавления пустых строк между строками в Windows?
  • Не удается дважды запустить KeyboardInterrupt в командной строке?
  • Запуск веб-сервера Python в качестве службы в Windows
  • One Solution collect form web for “Как получить IDLE, чтобы принять вставку символов Юникода?”

    Наконец я понял путь. Поскольку источники для IDLE являются частью дистрибутива, вы можете сделать пару быстрых изменений, чтобы включить эту возможность. Обычно файлы можно найти в C:\Python27\Lib\idlelib .

    Первым шагом является предотвращение попытки IDLE кодировать все эти симпатичные символы Юникода в набор символов, который не может их обработать. Это контролируется IOBinding.py . Отредактируйте файл, найдите раздел после if sys.platform == 'win32': и закомментируйте эту строку:

     #encoding = locale.getdefaultlocale()[1] 

    Теперь добавьте следующую строку:

     encoding = 'utf-8' 

    Я надеялся, что есть способ переопределить это с помощью переменной окружения или чего-то еще, но getdefaultlocale вызывает непосредственно в функцию Win32, которая получает глобально настроенную кодировку Windows mbcs.

    Это половина битвы, теперь нам нужно заставить интерпретатора командной строки признать, что входные байты кодируются в кодировке UTF-8. Не показалось, что есть способ передать кодировку в интерпретатор, поэтому я придумал мать всех хаков. Может быть, кто-то с немного большим терпением может придумать лучший способ, но сейчас это работает. Вход обрабатывается в PyShell.py в функции runsource . Измените следующее:

      if isinstance(source, types.UnicodeType): from idlelib import IOBinding try: source = source.encode(IOBinding.encoding) except UnicodeError: self.tkconsole.resetoutput() self.write("Unsupported characters in input\n") return 

    Для того, чтобы:

      from idlelib import IOBinding # line moved if isinstance(source, types.UnicodeType): try: source = source.encode(IOBinding.encoding) except UnicodeError: self.tkconsole.resetoutput() self.write("Unsupported characters in input\n") return source = "#coding=%s\n%s" % (IOBinding.encoding, source) # line added 

    Мы используем PEP 263, чтобы указать кодировку для каждой строки ввода, предоставленной интерпретатору.

    Обновление : в Python 2.7.10 больше не нужно делать изменения в PyShell.py , он уже работает правильно, если для кодировки установлено значение utf-8 . К сожалению, я не нашел способа обойти изменения в IOBinding.py .

    Interesting Posts
    Python - лучший язык программирования в мире.