python的编码问题

首先要确定一个问题,任何的编码转化都是要先将字串decode为unicode 然后再encode为你想要的编码 注意这个encode的参数不能是unicode 原因很简单,你总不能讲unicode再次转化为unicode吧

 

首先在ide eclipse里面 文件本身都是有文件格式的 windows下面默认是anci 也就是gbk

文件在开头的时候可以写上文件的代码的编码#coding: gbk  这个东西一旦写上,那么code.py里面应用print的时候,就会将print后面的字串先转化为#coding: gbk  里面的gbk编码 来输出

#coding: gbk
a=u'在'
b=a.encode('gbk')
print b

此时a是uncode b是gbk print b能正确的输出中文 但是 如果是下面这样

#coding: gbk
a=u'在'
b=a.encode('utf-8')
print b

那么b就会出书乱码 因为utf-8直接输出成gbk,而没有转化,必定是乱码

这个py文件的格式是utf-8 但是里面的默认编码是gbk print不认文件的编码 他要看的是coding后面的编码 这个一定要分清楚

至于py文件本身的格式会影响在你书写代码的时候,中文的显示问题,所以在修改格式后,要将乱码修改为正确的中文

 

其次是关于文件的读取问题 文件的中文路径问题

文件读取后,若是文件是utf-8编码的话,要注意txt文件里面的第一行的第一个字节无法编码 要删除才能编码 如下

在我们对一个不规范合法的编码字符串进行解码时会抛出异常:

>>> s = "/x84/xe5/xb0/x8f/xe6/x98/x8e"
>>> s.decode('utf-8')

Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
  File "E:/Program Files/Python24/lib/encodings/utf_8.py", line 16, in decode
UnicodeDecodeError: 'utf8' codec can't decode byte 0x84 in position 0: unexpected code byte
>>>

下面对s进行分析:

把s转换为二进制代码为:10000100 11100101 10110000 10001111 10110110 10011000 10001011

对这段二进制代码分析:第一个字节为10000100,而在utf-8编码规范规定0x80 到 0xBF 范围内的字节,只是跟随字节, 它们本身并不是字符,因此此处把它放到第一个字节处不不合法的。然后对第二个字节进行分析可看出它左边有三个连续的1,这意味着第二个字节和随后的两个字节,(即11100101 10110000 10001111 )共三个字节一起编码为一个字符。同理可分析出后面的三个字节编码为一个字符。

因此我们只要把第一个不合法的字节去掉,就可以正常解码了

>>> s = '/xe5/xb0/x8f/xe6/x98/x8e'
>>> print s.decode('utf-8')
小明
>>>

问题是如果我们不知道字符里的不合法字节的位置时该怎么进行解码并的出正常编码的那些字符的结果呢,我们可以使用如下两种方法:

>>> s = '/x84/xe5/xb0/x8f/xe6/x98/x8e/x84'
>>> s.decode('utf-8')
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
  File "E:/Program Files/Python24/lib/encodings/utf_8.py", line 16, in decode
UnicodeDecodeError: 'utf8' codec can't decode byte 0x84 in position 0: unexpected code byte
>>> print s.decode('utf-8', 'ignore')
小明
>>> print s.decode('utf-8', 'replace')
?小明?
>>>

由上面的代码我们可以看到调用decode函数时第二个参数为对于不合法(即错误)的字节处理的方式,默认情况下为'strict',即出现错误字节就抛出异常。而'ignore'方式,则会忽略字符串中不合法的字节,'replace'方式下会用固定的字节替换掉那些不合法的字节。

 

#coding: gbk  这里面不管你编码是什么,最终其实都是路径的问题只有是unicode才行的

import shutil 
import os 
import os.path 
src = u"c:\\日志.txt"
dst = u"c:\\日.txt"

shutil.copyfile(src, dst)

py编码的网上收集

1.来自sf  http://segmentfault.com/q/1010000000172582

我爬的网页源码顶端写的是 <meta charset="utf-8">
我在浏览器打开源码看到我想要的信息也是中文,
不过在urllib2.urlopen(url).read()输出来的却是类似于
&#38472;&#39062;
这种unicode编码
然后我使用 .encode('utf-8')也没有效果。。
请问该怎么转成中文?
(我的python程序是coding:utf-8)

 

import HTMLParser 
h = HTMLParser.HTMLParser()
print h.unescape("&#38472;&#39062;").encode("utf-8")
陈颖

&#开头都是HTTP转义的,可以用HTTPParser解码啊

那可以试试这样:

>>> h = HTMLParser.HTMLParser()
>>> import HTMLParser
>>> h = HTMLParser.HTMLParser()
>>> print h.unescape('&#38472;&#39062;')
陈颖
posted @ 2013-03-15 17:04  no13bus  阅读(685)  评论(0编辑  收藏  举报