如何在Python中获取Unicode月份名称?

3 投票
2 回答
3396 浏览
提问于 2025-04-15 16:32

我想要获取一个 Unicode 格式的 calendar.month_abbr[6]。如果我不为地区设置编码,我就不知道怎么把这个字符串转换成 Unicode。下面的示例代码展示了我的问题:

>>> 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'

有没有什么办法可以解决这个问题?解决方案不一定要像这样。只要能让我得到 Unicode 格式的缩写月份名称就可以了。

2 个回答

0

你需要的是:

…
myencoding= locale.getpreferredencoding()
print repr(calendar.month_abbr[6].decode(myencoding))
…
12

把你代码的最后一行改一下:

>>> 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 的限制。

撰写回答