时区名称"\xc3\xc0\xb9\xfa\xc9\xbd\xb5\xd8\xb1\xea\xd7\xbc\xca\



我有一个同事,他的计算机不会运行使用 dateutil.tz 模块的Python脚本;有一个时区名称'xc3xc0xb9xfaxc9xbdxb5xd8xb1xeaxd7xbcxcaxb1xbcxe4'显示,dateutil.tz有以下代码:

def tzname_in_python2(namefunc):
"""Change unicode output into bytestrings in Python 2
tzname() API changed in Python 3. It used to return bytes, but was changed
to unicode strings
"""
def adjust_encoding(*args, **kwargs):
name = namefunc(*args, **kwargs)
if name is not None and not PY3:
name = name.encode()
return name
return adjust_encoding

由于有问题的字符串不是 ASCII,因此会中断。这是什么字符串?它看起来不像有效的Unicode:

>>> a = 'xc3xc0xb9xfaxc9xbdxb5xd8xb1xeaxd7xbcxcaxb1xbcxe4'
>>> a.decode('utf8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:apppythonanaconda2envsemblazelibencodingsutf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc3 in position 0: invalid continuation byte

我的蟒蛇脚本包含

timezone = dateutil.tz.tzlocal()

并且由于时区名称的非 ASCII 性质,生成的对象无法timezone.tzname(some_timestamp)运行。

如果这种情况再次发生,有一个 python 模块:

>>> import chardet
>>> z = b'xc3xc0xb9xfaxc9xbdxb5xd8xb1xeaxd7xbcxcaxb1xbcxe4'
>>> chardet.detect(z)
{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}

啊哈,在网上搜索了一堆后,我想通了。它不是 UTF8 或 UTF16;它似乎是GB2312(或GBK(编码,可以使用gbk编解码器在Python中解码(至少在MS Windows上(:

>>> 'xc3xc0xb9xfaxc9xbdxb5xd8xb1xeaxd7xbcxcaxb1xbcxe4'.decode('gbk')
u'u7f8eu56fdu5c71u5730u6807u51c6u65f6u95f4'
>>> 'xc3xc0xb9xfaxc9xbdxb5xd8xcfxc4xc1xeexcaxb1'.decode('gbk')
u'u7f8eu56fdu5c71u5730u590fu4ee4u65f6'

其中打印出来(在IPython笔记本中(作为

美国山地标准时间

美国山地夏令时

谷歌翻译告诉我,分别代表"美国山区标准时间"和"美国山区夏令时"。

最新更新