代码之家  ›  专栏  ›  技术社区  ›  tzot

如何以编程方式查找Python已知的编解码器列表?

  •  4
  • tzot  · 技术社区  · 15 年前

    我知道我可以做到以下几点:

    >>> import encodings, pprint
    >>> pprint.pprint(sorted(encodings.aliases.aliases.values()))
    ['ascii',
     'base64_codec',
     'big5',
     'big5hkscs',
     'bz2_codec',
     'cp037',
     'cp1026',
     'cp1140',
     'cp1250',
     'cp1251',
     'cp1252',
     'cp1253',
     'cp1254',
     'cp1255',
     'cp1256',
     'cp1257',
     'cp1258',
     'cp424',
     'cp437',
     'cp500',
     'cp775',
     'cp850',
     'cp852',
     'cp855',
     'cp857',
     'cp860',
     'cp861',
     'cp862',
     'cp863',
     'cp864',
     'cp865',
     'cp866',
     'cp869',
     'cp932',
     'cp949',
     'cp950',
     'euc_jis_2004',
     'euc_jisx0213',
     'euc_jp',
     'euc_kr',
     'gb18030',
     'gb2312',
     'gbk',
     'hex_codec',
     'hp_roman8',
     'hz',
     'iso2022_jp',
     'iso2022_jp_1',
     'iso2022_jp_2',
     'iso2022_jp_2004',
     'iso2022_jp_3',
     'iso2022_jp_ext',
     'iso2022_kr',
     'iso8859_10',
     'iso8859_11',
     'iso8859_13',
     'iso8859_14',
     'iso8859_15',
     'iso8859_16',
     'iso8859_2',
     'iso8859_3',
     'iso8859_4',
     'iso8859_5',
     'iso8859_6',
     'iso8859_7',
     'iso8859_8',
     'iso8859_9',
     'johab',
     'koi8_r',
     'latin_1',
     'mac_cyrillic',
     'mac_greek',
     'mac_iceland',
     'mac_latin2',
     'mac_roman',
     'mac_turkish',
     'mbcs',
     'ptcp154',
     'quopri_codec',
     'rot_13',
     'shift_jis',
     'shift_jis_2004',
     'shift_jisx0213',
     'tactis',
     'tis_620',
     'utf_16',
     'utf_16_be',
     'utf_16_le',
     'utf_32',
     'utf_32_be',
     'utf_32_le',
     'utf_7',
     'utf_8',
     'uu_codec',
     'zlib_codec']
    

    我也确信这不是一个完整的清单,因为它包括 存在别名的编码(例如缺少“cp737”),并且至少缺少一些伪编码(例如“string_escape”)。

    正如问题的标题所说:如何以编程方式获得Python已知的所有编解码器/编码的列表?

    如果不是以编程方式:是否有一个完整的列表可以在线使用?

    1 回复  |  直到 15 年前
        1
  •  6
  •   unutbu    15 年前

    我不认为完整的列表存储在python标准库中的任何地方。相反,编码是通过调用 encoding.search_function(encoding) . 如果你研究那里的代码,它看起来像 encoding encodings 在包中搜索名称匹配的子模块 .

    以下用途 pkgutil 列出的所有子模块 ,然后将它们添加到中列出的值中 encoding.aliases.aliases

    不幸的是, 编码.别名.别名 tactis 这不是由上面的代码生成的,所以我试图通过合并这两个集合来生成完整的列表。

    import encodings
    import os
    import pkgutil
    
    modnames=set([modname for importer, modname, ispkg in pkgutil.walk_packages(
        path=[os.path.dirname(encodings.__file__)], prefix='')])
    aliases=set(encodings.aliases.aliases.values())
    
    print(modnames-aliases)
    # set(['charmap', 'unicode_escape', 'cp1006', 'unicode_internal', 'punycode', 'string_escape', 'aliases', 'palmos', 'mac_centeuro', 'mac_farsi', 'mac_romanian', 'cp856', 'raw_unicode_escape', 'mac_croatian', 'utf_8_sig', 'mac_arabic', 'undefined', 'cp737', 'idna', 'koi8_u', 'cp875', 'cp874', 'iso8859_1'])
    
    print(aliases-modnames)
    # set(['tactis'])
    
    codec_names=modnames.union(aliases)
    print(codec_names)
    # set(['bz2_codec', 'cp1140', 'euc_jp', 'cp932', 'punycode', 'euc_jisx0213', 'aliases', 'hex_codec', 'cp500', 'uu_codec', 'big5hkscs', 'mac_romanian', 'mbcs', 'euc_jis_2004', 'iso2022_jp_3', 'iso2022_jp_2', 'iso2022_jp_1', 'gbk', 'iso2022_jp_2004', 'unicode_internal', 'utf_16_be', 'quopri_codec', 'cp424', 'iso2022_jp', 'mac_iceland', 'raw_unicode_escape', 'hp_roman8', 'iso2022_kr', 'cp875', 'iso8859_6', 'cp1254', 'utf_32_be', 'gb2312', 'cp850', 'shift_jis', 'cp852', 'cp855', 'iso8859_3', 'cp857', 'cp856', 'cp775', 'unicode_escape', 'cp1026', 'mac_latin2', 'utf_32', 'mac_cyrillic', 'base64_codec', 'ptcp154', 'palmos', 'mac_centeuro', 'euc_kr', 'hz', 'utf_8', 'utf_32_le', 'mac_greek', 'utf_7', 'mac_turkish', 'utf_8_sig', 'mac_arabic', 'tactis', 'cp949', 'zlib_codec', 'big5', 'iso8859_9', 'iso8859_8', 'iso8859_5', 'iso8859_4', 'iso8859_7', 'cp874', 'iso8859_1', 'utf_16_le', 'iso8859_2', 'charmap', 'gb18030', 'cp1006', 'shift_jis_2004', 'mac_roman', 'ascii', 'string_escape', 'iso8859_15', 'iso8859_14', 'tis_620', 'iso8859_16', 'iso8859_11', 'iso8859_10', 'iso8859_13', 'cp950', 'utf_16', 'cp869', 'mac_farsi', 'rot_13', 'cp860', 'cp861', 'cp862', 'cp863', 'cp864', 'cp865', 'cp866', 'shift_jisx0213', 'johab', 'mac_croatian', 'cp1255', 'latin_1', 'cp1257', 'cp1256', 'cp1251', 'cp1250', 'cp1253', 'cp1252', 'cp437', 'cp1258', 'undefined', 'cp737', 'koi8_r', 'cp037', 'koi8_u', 'iso2022_jp_ext', 'idna'])
    
        2
  •  0
  •   ilias iliadis    6 年前

    gettextcodecs 图书馆( 再一个? 更简单