Что такое название часового пояса '\ xc3 \ xc0 \ xb9 \ xfa \ xc9 \ xbd \ xb5 \ xd8 \ xb1 \ xea \ xd7 \ xbc \ xca \ xb1 \ xbc \ xe4'? - PullRequest
0 голосов
/ 31 августа 2018

У меня есть коллега, чей компьютер не запускает скрипт Python, использующий модуль dateutil.tz; есть имя часового пояса '\xc3\xc0\xb9\xfa\xc9\xbd\xb5\xd8\xb1\xea\xd7\xbc\xca\xb1\xbc\xe4', которое отображается, а в 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 = '\xc3\xc0\xb9\xfa\xc9\xbd\xb5\xd8\xb1\xea\xd7\xbc\xca\xb1\xbc\xe4'
>>> a.decode('utf8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:\app\python\anaconda\2\envs\emblaze\lib\encodings\utf_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

Мой скрипт на Python содержит

timezone = dateutil.tz.tzlocal()

и результирующий объект не запускается timezone.tzname(some_timestamp) из-за не-ASCII-природы имени часового пояса.

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Если это произойдет снова, для этого есть модуль python:

>>> import chardet
>>> z = b'\xc3\xc0\xb9\xfa\xc9\xbd\xb5\xd8\xb1\xea\xd7\xbc\xca\xb1\xbc\xe4'
>>> chardet.detect(z)
{'encoding': 'GB2312', 'confidence': 0.99, 'language': 'Chinese'}
0 голосов
/ 31 августа 2018

Ага, я разобрался после кучки поисков в сети. Это не UTF8 или UTF16; похоже, это кодировка GB2312 (или GBK ), которую можно декодировать в Python (по крайней мере, в MS Windows) с помощью кодека gbk:

>>> '\xc3\xc0\xb9\xfa\xc9\xbd\xb5\xd8\xb1\xea\xd7\xbc\xca\xb1\xbc\xe4'.decode('gbk')
u'\u7f8e\u56fd\u5c71\u5730\u6807\u51c6\u65f6\u95f4'
>>> '\xc3\xc0\xb9\xfa\xc9\xbd\xb5\xd8\xcf\xc4\xc1\xee\xca\xb1'.decode('gbk')
u'\u7f8e\u56fd\u5c71\u5730\u590f\u4ee4\u65f6'

, которые распечатываются (в IPython Notebook) как

美国 山地 标准 时间

美国 山地 夏令 时

, который, по словам Google Translate, представляет «Стандартное американское горное время» и «Американское горное летнее время» соответственно.

...