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

如何使用python迭代给定编码中的每个字符?

  •  2
  • Geo  · 技术社区  · 15 年前

    有没有一种方法可以迭代给定编码中的每个字符,并打印它的代码?比如说,UTF8?

    4 回复  |  直到 6 年前
        1
  •  4
  •   John Machin Santi    15 年前

    所有Unicode字符都可以用 UTF-n 对于所有定义 n . 你想达到什么目的?

    如果您真的想打印特定编码中的所有有效字符,而不需要知道编码是“单字节”还是“多字节”,或者其大小是否固定:

    import unicodedata as ucd
    import sys
    
    def dump_encoding(enc):
        for i in xrange(sys.maxunicode):
            u = unichr(i)
            try:
                s = u.encode(enc)
            except UnicodeEncodeError:
                continue
            try:
                name = ucd.name(u)
            except:
                name = '?'
            print "U+%06X %r %s" % (i, s, name)
    
    if __name__ == "__main__":
        dump_encoding(sys.argv[1])
    

    建议:尝试一些小的东西,比如 cp1252 . 将stdout重定向到文件。

        2
  •  4
  •   tzot    15 年前

    伙计,你知道Unicode中有多少个代码点吗?

    顺便说一句,来自python文档:

    UNICHR(I)

    返回一个Unicode代码为整数i的字符的Unicode字符串。例如,unichr(97)返回字符串u'a'。这是unicode字符串的ORD()的倒数。参数的有效范围取决于如何配置python,它可以是ucs2[0..0xffff]或ucs4[0..0x10ffff]。否则将引发ValueError。有关ASCII和8位字符串,请参阅chr()。

    2.0版新增。

    所以

    import sys
    for i in xrange(sys.maxunicode + 1):
        print unichr(i)
    
        3
  •  1
  •   Ignacio Vazquez-Abrams    15 年前

    对于单字节编码,可以使用:

    ''.join(chr(x) for x in range(256)).decode(encoding, 'ignore')
    

    获取包含给定编码中所有有效字符的字符串。

    对于固定大小的多字节编码,请小心使用 struct.pack() 代替 chr() 应该工作。

        4
  •  1
  •   ZongNan Jin    6 年前

    我在用蟒蛇3.7

    import unicodedata as ucd
    import sys
    
    def dump_encoding(enc):
        for i in range(sys.maxunicode):
            u = chr(i)
            try:
                s = u.encode(enc)
            except UnicodeEncodeError:
                continue
            try:
                name = ucd.name(u)
            except:
                name = '?'
            print (i, s, u, name)
    
    if __name__ == "__main__":
        sys.getdefaultencoding()
        dump_encoding(sys.argv[1])
    

    确保使用正确版本的python运行脚本,并且需要一个参数:

    python3.7 ./iterate_over_charset.py utf-8 > unicode_all.txt
    

    样品输出:

    4473 b'\xe1\x85\xb9' ᅹ HANGUL JUNGSEONG YA-YO
    4474 b'\xe1\x85\xba' ᅺ HANGUL JUNGSEONG EO-O
    4475 b'\xe1\x85\xbb' ᅻ HANGUL JUNGSEONG EO-U
    4476 b'\xe1\x85\xbc' ᅼ HANGUL JUNGSEONG EO-EU
    4477 b'\xe1\x85\xbd' ᅽ HANGUL JUNGSEONG YEO-O
    4478 b'\xe1\x85\xbe' ᅾ HANGUL JUNGSEONG YEO-U
    4479 b'\xe1\x85\xbf' ᅿ HANGUL JUNGSEONG O-EO
    4480 b'\xe1\x86\x80' ᆀ HANGUL JUNGSEONG O-E
    4481 b'\xe1\x86\x81' ᆁ HANGUL JUNGSEONG O-YE