代码之家  ›  专栏  ›  技术社区  ›  Jason S

时区名称“\xc3\xc0\xb9\xfa\xc9\xbd\xb5\xd8\xb1\xea\xd7\xbc\xca\xb1\xbc\xe4”是什么?

  •  0
  • Jason S  · 技术社区  · 6 年前

    我有个同事的电脑不会运行使用日期工具.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
    

    timezone = dateutil.tz.tzlocal()
    

    结果对象无法运行 timezone.tzname(some_timestamp)

    2 回复  |  直到 6 年前
        1
  •  1
  •   nicolas    6 年前

    如果这种情况再次发生,则有一个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'}
    
        2
  •  0
  •   Jason S    6 年前

    啊哈,我在网上搜索了一番才弄明白。它不是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'
    

    ±±°é

    ±±°¤¤

    谷歌翻译告诉我,它分别代表“美国山地标准时间”和“美国山地夏季时间”。