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

读取字符时python中的utf-8问题

  •  8
  • jacob  · 技术社区  · 16 年前

    我使用的是python 2.5。这是怎么回事?我误解了什么?我怎么修?

    TXT:

    Stäckövérfløw
    

    密码

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    print """Content-Type: text/plain; charset="UTF-8"\n"""
    f = open('in.txt','r')
    for line in f:
        print line
        for i in line:
            print i,
    f.close()
    

    输出:

    Stäckövérfløw
    
    S t � � c k � � v � � r f l � � w 
    
    5 回复  |  直到 11 年前
        1
  •  14
  •   Miles    16 年前
    for i in line:
        print i,
    

    读取文件时,所读取的字符串是一个字节字符串。for循环一次迭代一个字节。这会导致UTF-8编码字符串出现问题,其中非ASCII字符由多个字节表示。如果要使用Unicode对象,其中字符是基本部分,则应使用

    import codecs
    f = codecs.open('in', 'r', 'utf8')
    

    如果 sys.stdout 尚未设置适当的编码集,您可能需要将其包装:

    sys.stdout = codecs.getwriter('utf8')(sys.stdout)
    
        2
  •  2
  •   mhawke    16 年前

    使用codecs.open,它对我有效。

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    print """Content-Type: text/plain; charset="UTF-8"\n"""
    f = codecs.open('in','r','utf8')
    for line in f:
        print line
        for i in line:
            print i,
    f.close()
    
        3
  •  1
  •   mikl    16 年前

    看看这个:

    # -*- coding: utf-8 -*-
    import pprint
    f = open('unicode.txt','r')
    for line in f:
        print line
        pprint.pprint(line)
        for i in line:
            print i,
    f.close()
    

    它返回这个:

    圣克鲁克
    'ST\XC3\xa4ck\xc3\xb6v\xc3\xa9rfl\xc3\xb8w'
    S??V?R?L?W?

    问题是文件只是作为一个字节串被读取。通过迭代,可以将多字节字符拆分为无意义的字节值。

        4
  •  1
  •   Artyom    16 年前
    print c,
    

    添加一个“空白字符转换器”,并将正确的UTF-8序列拆分为不正确的序列。因此,除非您将一个signle字节写入输出,否则这将不起作用。

    sys.stdout.write(i)
    
        5
  •  0
  •   j1k00    11 年前

    一个人可能只想用

    f = open('in.txt','r')
    for line in f:
        print line
        for i in line.decode('utf-8'):
            print i,
    f.close()