обработка Unicode-строк в Windows - PullRequest
2 голосов
/ 22 июля 2011

Впервые я попробовал один из моих скриптов Python, который работает с символами юникода, в Windows (Vista) и обнаружил, что он не работает. Сценарий прекрасно работает на Linux и OS X, но не радует Windows. Вот маленький скрипт, который я пробовал:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os, sys, codecs

reload(sys)
sys.setdefaultencoding('utf-8')
print "\nDefault encoding\t: %s" % sys.getdefaultencoding()
print "sys.stdout.encoding\t: %s\n" % sys.stdout.encoding

## Unicode strings
ln1 = u"?0>9<8~7|65\"4:3}2{1+_)(*&^%$£@!/`\\][=-"
ln2 = u"mnbvc xzasdfghjkl;'poiuyàtrewq€é#¢."

refStr = u"%s%s" % (ln2,ln1)
print "refSTR: ", refStr

for x in refStr:
    print "%s => %s" % (x, ord(u"%s" % x))

Когда я запускаю скрипт из интерфейса командной строки Windows, я получаю эту ошибку:

C:\Users\san\Scripts>python uniCode.py

Default encoding        : utf-8
sys.stdout.encoding     : cp850

refSTR;  Traceback (most recent call last):
  File "uniCode.py", line 18, in <module>
    print "refSTR; ", refStr
  File "C:\Python27\lib\encodings\cp850.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u20ac' in position
 30: character maps to <undefined>

Я наткнулся на эту Python-вики и попробовал несколько вещей оттуда, но это не сработало. Кто-нибудь знает, что мне все еще не хватает? Любая помощь с благодарностью. Ура !!

Ответы [ 2 ]

5 голосов
/ 22 июля 2011

Консоль Windows имеет Unicode API, но не utf-8. Python пытается кодировать символы Unicode в 8-битную кодовую страницу вашей консоли cp850, которая, очевидно, не будет работать. Предположительно, в консоли Windows есть кодовая страница (chcp 65001), которая поддерживает utf-8, но она сильно повреждена. Прочитайте выпуск 1602 и посмотрите на sys_write_stdout.patch и unicode2.py, которые используют функции широких символов Unicode, такие как WriteConsoleOutputW и WriteConsoleW. К сожалению, это проблема с низким приоритетом.

К вашему сведению, вы также можете использовать IDLE или другую консоль с графическим интерфейсом (на основе pythonw.exe) для запуска сценария, который выводит символы Unicode. Например:

C:\pythonXX\Lib\idlelib\idle.pyw -r script.py

Но это не общее решение, если вам нужно написать инструменты консоли CLI.

1 голос
/ 22 июля 2011

setdefaultencoding и getdefaultencoding обозначают кодировку, за которой следует интерпретатор python, и пока вы используете sys.stdout.encoding, это обозначает кодировку, используемую вашим терминалом. Вы можете убедиться в этом, если бы записали это в файл против печати в терминале.

Способ «исправить» эту программу состоял бы в том, чтобы установить кодировку терминала на то, что вы хотите (utf-8) или записать в файл и открыть вывод в редакторе, который поддерживает эти конкретные символы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...