Как мне сказать Python, что sys.argv в Unicode - PullRequest
13 голосов
/ 25 февраля 2011

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

import sys

f = sys.argv[1]
print type(f)
print u"f=%s" % (f)

Вот мой запуск программы:

$ python x.py 'Recent/רשימת משתתפים.LNK'
<type 'str'>
Traceback (most recent call last):
  File "x.py", line 5, in <module>
    print u"f=%s" % (f)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd7 in position 7: ordinal not in range(128)
$ 

Проблема в том, что sys.argv [1] думает, что он получаетстрока ascii, которую он не может преобразовать в Unicode.Но я использую Mac с полным терминалом, поддерживающим Unicode, поэтому x.py фактически получает строку Unicode.Как мне сказать Python, что sys.argv [] - это Unicode, а не Ascii?В противном случае, как я могу преобразовать ASCII (в котором есть Unicode) в Unicode?Очевидные преобразования не работают.

Ответы [ 5 ]

18 голосов
/ 25 февраля 2011

Ошибка UnicodeDecodeError, которую вы видите, связана с тем, что вы смешиваете строку Unicode u"f=%s" и sys.argv[1] bytestring:

  • обе строки:

    $ python -c'import sys; print "f=%s" % (sys.argv[1],)' 'Recent/רשימת משתתפים'
    

    Это прозрачно передает байты от / к вашему терминалу. Работает для любой кодировки.

  • оба Unicode:

    $ python -c'import sys; print u"f=%s" % (sys.argv[1].decode("utf-8"),)' 'Rec..
    

    Здесь вы должны заменить 'utf-8' на кодировку, которую использует ваш терминал. Вы можете использовать sys.getfilesystemencoding() здесь, если терминал не поддерживает Unicode.

Обе команды выдают одинаковый вывод:

f=Recent/רשימת משתתפים

Как правило, вы должны преобразовать строки байтов, которые вы считаете текстовыми, в Unicode как можно скорее.

4 голосов
/ 30 мая 2013
sys.argv = map(lambda arg: arg.decode(sys.stdout.encoding), sys.argv)

или вы можете выбрать кодировку из locale.getdefaultlocale()[1]

3 голосов
/ 25 февраля 2011

Параметры командной строки передаются в Python в виде байтовой строки с использованием кодировки, используемой в оболочке, используемой для запуска Python. Таким образом, невозможно передать параметры командной строки в Python в виде строки Unicode, кроме преобразования параметров own в Unicode внутри вашего приложения.

2 голосов
/ 25 декабря 2012

попробуйте либо:

f = sys.argv[1].decode('utf-8')

или:

f = unicode(sys.argv[1], 'utf-8')
2 голосов
/ 25 февраля 2011
  1. sys.argv никогда не "в Unicode";он закодирован наверняка, но Unicode - это не кодировка, а набор кодовых точек (чисел), где каждое число уникально представляет символ.http://www.unicode.org/standard/WhatIsUnicode.html

  2. Перейдите на Terminal.app> Терминал> Настройки> Настройки> Кодировка символов и выберите UTF-8 из раскрывающегося списка.

  3. Кроме того, стандартный Python, который поставляется с Mac OS X, имеет один недостаток в отношении Unicode: он построен с использованием устаревшего UCS-2 по умолчанию;см .: http://webamused.wordpress.com/2011/01/31/building-64-bit-python-python-org-using-ucs-4-on-mac-os-x-10-6-6-snow-leopard/

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