Как получить название месяца в Юникоде на Python? - PullRequest
3 голосов
/ 30 ноября 2009

Я пытаюсь получить Unicode-версию calendar.month_abbr[6]. Если я не укажу кодировку для локали, я не знаю, как преобразовать строку в юникод. Пример кода ниже показывает мою проблему:

>>> import locale
>>> import calendar
>>> locale.setlocale(locale.LC_ALL, ("ru_RU"))
'ru_RU'
>>> print repr(calendar.month_abbr[6])
'\xb8\xee\xdd'
>>> print repr(calendar.month_abbr[6].decode("utf8"))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.5/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xb8 in position 0: unexpected code byte
>>> locale.setlocale(locale.LC_ALL, ("ru_RU", "utf8"))
'ru_RU.UTF8'
>>> print repr(calendar.month_abbr[6])
'\xd0\x98\xd1\x8e\xd0\xbd'
>>> print repr(calendar.month_abbr[6].decode("utf8"))
u'\u0418\u044e\u043d'

Есть идеи, как это решить? Решение не должно выглядеть так. Подойдет любое решение, которое дает мне сокращенное название месяца в юникоде.

Ответы [ 2 ]

12 голосов
/ 30 ноября 2009

Измените последнюю строку в вашем коде:

>>> print calendar.month_abbr[6].decode("utf8")
Июн

Неправильное использование repr() скрывает от вас, что вы уже получили то, что вам нужно.

Также getlocale() может использоваться для получения кодировки для текущей локали:

>>> locale.setlocale(locale.LC_ALL, 'en_US')
'en_US'
>>> locale.getlocale()
('en_US', 'ISO8859-1')

Другие модули, которые могут быть вам полезны:

  • PyICU - лучший способ интернационализации. В то время как locale создает либо начальную, либо перекошенную форму названия месяца в зависимости от базы данных локали в вашей ОС (так что вы не можете полагаться на нее для таких языков, как русский!) И использует некоторую кодировку, PyICU имеет разные спецификаторы формата для начальной и перевернутая форма (чтобы вы могли выбрать подходящий в вашем случае) и использует Unicode.
  • pytils - набор инструментов для работы с русским языком, включая даты. В качестве обходного пути для ограничений locale указаны жестко заданные названия месяцев.
0 голосов
/ 01 декабря 2009

Что вам нужно, это:

…
myencoding= locale.getpreferredencoding()
print repr(calendar.month_abbr[6].decode(myencoding))
…
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...