nainai1 发表于 2017-4-24 09:37:45

Python的中文字符乱码

  打算用Python解析一下网络日志文件。
  必然地遇上了中文乱码的问题。
  小弟以前学Java,用Python解决中文乱码的问题真不知道如何入手。
  在Java下面调试通过的代码,放在Python环境下就给我闹脾气了。
  费我九牛二虎之力,终于在一位Oschina大大的帮助下问题解决了。
  Python编码的思路主要是:
  1.字符串
  2.Unicode
  3.目标编码集 其中(CP936,GB2312,GBK,GB18030貌似可以互相直接转换,大部分的编码是一样的)
  了解Python的系统编码的结构,先看下以下的一段代码:

import locale
def p(f):
print '%s.%s(): %s' % (f.__module__, f.__name__, f())
# 返回当前系统所使用的默认字符编码
p(sys.getdefaultencoding)
# 返回用于转换Unicode文件名至系统文件名所使用的编码
p(sys.getfilesystemencoding)
# 获取默认的区域设置并返回元祖(语言, 编码)
p(locale.getdefaultlocale)
# 返回用户设定的文本数据编码
# 文档提到this function only returns a guess
p(locale.getpreferredencoding)
# \xba\xba是'汉'的GBK编码
# mbcs是不推荐使用的编码,这里仅作测试表明为什么不应该用
print r"'\xba\xba'.decode('mbcs'):", repr('\xba\xba'.decode('mbcs'))
#在笔者的Windows上的结果(区域设置为中文(简体, 中国))
#sys.getdefaultencoding(): gbk
#sys.getfilesystemencoding(): mbcs
#locale.getdefaultlocale(): ('zh_CN', 'cp936')
#locale.getpreferredencoding(): cp936
#'\xba\xba'.decode('mbcs'): u'\u6c49'
  学习Python的时候,有个repr()函数。
  这个函数是用来揭示字符串的本来面目!!
  同样是  “你好”
  utf-8的格式是 \\xc4\\xe3\\xba\\xc3
  GBK格式是  u'\\u4f60\\u597d
  当你不了解你的字符编码的格式,可以用repr函数打开它来看一下。
  在编码转换的过程中,经常会有字节丢失,导致转换编码过程失败。
  所以,我们会在编码转换过程中加上 ignore 并打印错误异常:

import sys
import urllib
def urlResolve(url):
try:
output = url.decode('utf8','ignore').encode('gbk')
return output
except:
print' ERROR ',sys.exc_info(),url
  使用了ignore以后,就会忽略编码中的错误,尽可能地进行编码的翻译。
  对于Python普通的py文件,往往会加上:
  #!/usr/bin/env python
#coding=utf-8
或者
  #!/usr/bin/env python
#coding=gbk
来指定文件的编码格式。
页: [1]
查看完整版本: Python的中文字符乱码