+ -
当前位置:首页 → 问答吧 → 看《可爱的Python》遇到的中文编码问题

看《可爱的Python》遇到的中文编码问题

时间:2010-11-15

来源:互联网

《可爱的Python》有个光盘信息检索的例子,涉及到中文的问题,写了个小程序想先test下,结果出了一堆问题,比较繁琐,还希望各位抽出点时间帮忙看看。

具体情况如下。

===测试的文件目录结构===

G:\ZHANG\TEST
| test_中文.txt
| test_新建 WPS文字 文档.wps
|  
\---dir_subtest_中文
  file_subtest_新建 WPS文字 文档.wps
  file_subtest_新建文本文档.txt

===_smartcode.py===

Python code

# -*- coding: utf-8 -*-

import chardet

def _smartcode(stream):
    """smart recove stream into UTF-8
    """
    ustring = stream
    codedetect = chardet.detect(ustring)["encoding"]
    print codedetect
    try:
        print ustring
        ustring = unicode(ustring, codedetect)
        print ustring
        print ustring.encode("utf8")
        return "%s" % (ustring.encode('utf8'))
    except:
        return u"bad unicode encode try!"



===chinese_test.py===
Python code

# -*- coding: utf-8 -*-

import os, _smartcode

def encode_to_utf8(root, dirs, files):
    export = "\n" + root + "\n"
    for d in dirs:
        export += '-d ' + root + _smartcode._smartcode(d) + "\n"
    for f in files:
        export += "-f %s %s \n" % (root, _smartcode._smartcode(f))
    export += "="*70
    return export
    
def walker():
    for root, dirs, files in os.walk('G:\\zhang\\test'):
        print encode_to_utf8(root, dirs, files)

if __name__ == '__main__':
    result = walker()
    print result



用到了一个 chardet 模块,chardet.feedparser.org

遇到的错误

1
test 中的 test_新建 WPS 文字 文档.wps
在 _smartcode 中编码为 utf8 输出后乱码,而作为字符串返回时正常

2
dir_subtest2中文 中的 file_subtest2_新建 WPS 文字 文档.wps
在 _smartcode 中编码为 utf8 输出后乱码,而作为字符串返回时也乱码(file_subtest2_新建文本文档 也是如此),这个错误与第一个错误不同,上一个错误作为字符串返回时正常

对于1和2,为什么同样的字符和同样的处理,结果却不同呢

3
在 test 目录中有两个文件:test_中文.txt 和 test_新建 WPS文字 文档.wps,对 test_中文.txt 处理的时候没有出现乱码,对wps文档处理时则出现了乱码(见第一个分割线上的内容),而对两者的处理都是由 GB2312 -> UTF8,为什么对字符做同样的处理,有的会出现乱码,有的不会呢?


这个编码的问题困惑了我很久,希望各位能抽出点宝贵的时间解答一下,谢谢!

作者: xiandao7997   发布时间: 2010-11-15

命令行里不能直接向屏幕打印utf8编码的str,只能打印gbk(本地编码)str或者unicode。

作者: iambic   发布时间: 2010-11-15

忘了说,是在 IDLE 中调试的,不是命令行,IDLE 中是 UTF-8 的编码,命令行是 GBK,记得以前在 csdn 上看过

作者: xiandao7997   发布时间: 2010-11-15

那你就要自己检验下了,直接打印如下三条语句,看看哪几条能正确显示:
Python code
print u'\u5317\u4eac\u5929\u5b89\u95e8'
print u'\u5317\u4eac\u5929\u5b89\u95e8'.encode('gbk')
print u'\u5317\u4eac\u5929\u5b89\u95e8'.encode('utf8')

作者: iambic   发布时间: 2010-11-15