Python - строка кодирования - шведские буквы - PullRequest
3 голосов
/ 06 сентября 2011

У меня проблемы с командой Python raw_input (Python2.6), По какой-то причине raw_input не получает преобразованную строку, которую генерирует swedify (), и это дает мне ошибку кодирования, о которой я знаю, поэтому для начала я сделал swedify (). Вот что я пытаюсь сделать:

elif cmd in ('help', 'hjälp', 'info'):
    buffert += 'Just nu är programmet relativt begränsat,\nDe funktioner du har att använda är:\n'
    buffert += ' * historik :: skriver ut all din historik\n'
    buffert += ' * ändra <något> :: ändrar något i databasen, följande finns att ändra:\n'
    print swedify(buffert)

Это прекрасно работает, выводит шведские символы так, как я хочу, чтобы они выводились на консоль. Но когда я пытаюсь (в том же коде, с теми же значениями \ x ??, распечатать этот кусок:

core['goalDistance'] = raw_input(swedify('Hur långt i kilometer är ditt mål: '))
core['goalTime'] = raw_input(swedify('Vad är ditt mål i minuter att springa ' +  core['goalDistance'] + 'km på: '))

Тогда я получу это:

C:\Users\Anon>python löp.py
Traceback (most recent call last):
  File "l÷p.py", line 92, in <module>
    core['goalDistance'] = raw_input(swedify('Hur långt i kilometer är ditt mål: '))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe5' in position 5: ordinal not in range(128)

Теперь я погуглил, нашел несколько «решений», но ни одно из них не работает, некоторые грустные, что мне нужно создать пакетный скрипт, который выполняет chcp ??? в начале, но это не чистое решение ИМО.

Вот свидания:

def swedify(inp):
    try:
        return inp.decode('utf-8')
    except:
        return '(!Dec:) ' + str(inp)

Любые решения о том, как получить raw_input для чтения моего возвращаемого значения из swedify ()? я пытался из кодировки импортировать getencoder, getdecoder и другие, но ничего к лучшему.

Ответы [ 6 ]

3 голосов
/ 16 июня 2013

Для меня это работало нормально с:

#-*- coding: utf-8 -*-
import sys
import codecs
koden=sys.stdin.encoding

a=raw_input( u'Frågan är öppen? '.encode(koden))
print a

За

3 голосов
/ 06 сентября 2011

Вы упоминаете тот факт, что вы получили ошибку кодирования, которая побудила вас написать swedify, и вы нашли решения вокруг chcp, который является командой Windows.

В * nix системах с терминалами UTF-8, swedify не требуется:

>>> raw_input('Hur långt i kilometer är ditt mål: ')
Hur långt i kilometer är ditt mål: 100
'100'
>>> a = raw_input('Hur långt i kilometer är ditt mål: ')
Hur långt i kilometer är ditt mål: 200
>>> a
'200'

FWIW, когда я делаю использую swedify, я получаю ту же ошибку, что и вы:

>>> def swedify(inp):
...     try:
...         return inp.decode('utf-8')
...     except:
...         return '(!Dec:) ' + str(inp)
... 
>>> swedify('Hur långt i kilometer är ditt mål: ') 
u'Hur l\xe5ngt i kilometer \xe4r ditt m\xe5l: '
>>> raw_input(swedify('Hur långt i kilometer är ditt mål: '))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe5' in position 5: ordinal not in range(128)

Ваша swedify функция возвращает объект Unicode. Встроенный raw_input просто недоволен объектами Unicode.

>>> raw_input("å")
åeee
'eee'
>>> raw_input(u"å")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe5' in position 0: ordinal not in range(128)

Возможно, вы захотите попробовать это в Python 3. Смотрите это Ошибка Python .

Также представляет интерес: Как читать ввод Unicode и сравнивать строки Unicode в Python? .

ОБНОВЛЕНИЕ Согласно этому сообщению в блоге существует способ установить кодировку системы по умолчанию. Возможно, стоит попробовать.

2 голосов
/ 26 декабря 2015

В Windows встроенная поддержка Unicode консоли не работает. Даже кажущаяся кодовая страница UTF-8 не является правильным решением.

Для чтения и записи с консоли Windows вам необходимо использовать https://github.com/Drekin/win-unicode-console,, который работает непосредственно с базовым API консоли, чтобы многобайтовые символы читались и записывались правильно.

0 голосов
/ 19 января 2015

В командной строке Windows используется кодовая страница 850 при использовании региональных настроек Швеции (https://en.wikipedia.org/wiki/Code_page_850). Возможно, она используется из-за обратной совместимости со старыми программами MS-Dos.

Вы можете настроить командную строку Windows на использование UTF-8 в качестве кодировки путем ввода: chcp 65001 ( Unicode-символы в командной строке Windows - как? )

0 голосов
/ 25 октября 2011

Решение многих проблем:


Редактировать: C: \ Python ?? \ Lib \ Site.py Заменить "del sys.setdefaultencoding" на "pass"

Затем
Поместите это в верхнюю часть кода:

sys.setdefaultencoding('latin-1')

Святой Грааль исправления шведских / не-UTF8-совместимых символов.

0 голосов
/ 06 сентября 2011

Попробуйте этот волшебный комментарий в самом верху вашего скрипта:

# -*- coding: utf-8 -*-

Вот некоторая информация об этом: http://www.python.org/dev/peps/pep-0263/

...