【问题标题】:How can I programmatically find the list of codecs known to Python? [duplicate]如何以编程方式查找 Python 已知的编解码器列表? [复制]
【发布时间】:2011-04-18 22:55:23
【问题描述】:

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

>>> 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 已知的所有编解码器/编码的列表?

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

【问题讨论】:

    标签: python internationalization character-encoding


    【解决方案1】:

    我不认为完整的列表存储在 python 标准库的任何地方。相反,编码是通过调用encoding.search_function(encoding) 按需加载的。如果你研究那里的代码,看起来encoding 字符串首先被规范化,然后在encodings 包中搜索名称与encoding 匹配的子模块。

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

    不幸的是,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'])
    

    【讨论】:

    • @killown:你投反对票了吗?如果是,您不应该这样做,因为它提供了对编程有用的结果(一组),这是我的主要目标。如何在程序中迭代help(encodings)
    • 一般情况下:任何对此答案投反对票的人都完全不了解增票/减票的含义,因此应在点击前将鼠标指针悬停在箭头上。
    • @killown:确实;看看谁投票结束了这个问题。不幸的是,发布问题之后的类似问题列表与期间输入问题的列表不同相同;此外,使用“[python] 编码列表”进行搜索也没有找到旧问题。
    【解决方案2】:

    要么安装gettextcodecs 库(一个更多?)或只是(更简单)从该库中获取代码并使用它。未检查它是否适用于 python

    【讨论】:

      猜你喜欢
      • 2011-03-23
      • 1970-01-01
      • 2021-04-12
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-15
      • 1970-01-01
      相关资源
      最近更新 更多