gbk函数python 䶮 gbk

python中 gbk字符串被识别为unicode(就是读取到的应该是'内容内容'变成了 u'内容内容',这样应该如何解码?

你用的是哪个库 ,如果是pymssql 的话,我建议换个库我测试末尾带b字样的版本没有这个问题

目前成都创新互联已为近1000家的企业提供了网站建设、域名、虚拟主机、网站托管、服务器托管、企业网站设计、二道江网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

有些库是有这样的问题,所有编码自己加上U,尝试更换库试一下

刚才百度了一下,看到一个解决办法不错,考虑转载到我的空间,我确实遇到了这样的问题

方法如下:

python 提供了一个特殊的编码( raw_unicode_escape )用来处理这种情况:

In [4]: u'\xe4\xbd\xa0\xe5\xa5\xbd'.encode('raw_unicode_escape')

Out[4]: '\xe4\xbd\xa0\xe5\xa5\xbd'

In [5]: u'\xe4\xbd\xa0\xe5\xa5\xbd'.encode('raw_unicode_escape').decode('utf8')

Out[5]: u'\u4f60\u597d'

In [7]: print u'\u4f60\u597d'

你好

以前杂没发现这个方法呢...我遇到这个问题是找个关天,换了个库才搞定

python语言中的如何输入编号叫什么

Python 默认脚本文件都是 ANSCII 编码的,当文件 中有非 ANSCII 编码范围内的字符的时候就要使用"编码指示"来修正。 一个module的定义中,如果.py文件中包含中文字符(严格的说是含有非anscii字符),则需要在第一行或第二行指定编码声明:

# -*- coding=utf-8 -*-或者 #coding=utf-8 其他的编码如:gbk、gb2312也可以; 否则会出现类似:SyntaxError: Non-ASCII character '/xe4' in file ChineseTest.py on line 1, but no encoding declared; see for details这样的异常信息;n.org/peps/pep-0263.html

命令查看脚本默认的编码方式

import sys

sys.getdefaultencoding()

'ascii'

2.2 python中的编码与解码

先说一下python中的字符串类型,在python中有两种字符串类型,分别是str和unicode,他们都是basestring的派生类;str类型是一个包含Characters represent (at least) 8-bit bytes的序列;unicode的每个unit是一个unicode obj;所以:

len(u'中国')的值是2;len('ab')的值也是2;

在str的文档中有这样的一句话:The string data type is also used to represent arrays of bytes, e.g., to hold data read from a file. 也就是说在读取一个文件的内容,或者从网络上读取到内容时,保持的对象为str类型;如果想把一个str转换成特定编码类型,需要把str转为Unicode,然后从unicode转为特定的编码类型如:utf-8、gb2312等;

2.2.1 print 语句解释编码问题

print 是打印默认的编码方式,相当于对任何对象encode编码转化成str对象。默认是gbk的编码就是对Unicode进行自动的gbk编码,再按照gbk编码输出。

当print语句碰到一个unicode目标的时候,会用当前python shell环境的默认编码格式首先对unicode对象进行encode(此时unicode对象已经变成了一个str对象了),然后再以默认编码格式为基础,根据其包含的汉字和编码的对应规则,把这个str对象解释成中文并显示出来。但是当print语句碰到的直接是个str目标的时候,就不管其从unicode转到str时用的编码格式是什么,直接用默认编码格式的对应规则来解释成中文。所以,当unicode对象转换成str时的编码格式和print语句的默认编码格式不一致的时候就会出现乱码现象。比如在cmd的python shell里面:

复制代码

复制代码

证明Python 系统默认编码gbk

s= '你好'

s

'\xc4\xe3\xba\xc3'

s = u'你好'

s

u'\xc4\xe3\xba\xc3'

s = '你好'

s

'\xc4\xe3\xba\xc3'

print type(s)

type 'str'

unicode 编码打印错误,print 解析字符串而不是Unicode 编码

s = u'你好'

print s

ÄãºÃ

uni = u'你好' #存入一个unicode对象

print uni

你好 #可以正常显示 相当于Unicode.encode(gbk)

uni.encode("gbk")

'\xc4\xe3\xba\xc3' #显示的是个str对象了,如果type(uni.encode("gbk"))得到的就是str对象

print uni.encode("gbk")

你好 #可以正常显示,因为在cmd下的pythonshell里默认个编码格式就是gbk,gbk解析

uni.encode("utf-8")

'\xe4\xbd\xa0\xe5\xa5\xbd' #可以看到,encode用的编码格式不同,编成的字符串也是不同的

print uni.encode("utf-8")

浣犲ソ #乱码,因为用了gbk中汉字和字符串编码格式对应规则去解释了用utf-8编码成的字符串。解释的编码格式不对应。

#######さらに######

print '\xc4\xe3' #自己写出来的这么个字符串(前面不加r)的话也会被print解释成中文,按照编码格式输出

print uni.encode("utf-8").decode("gbk")

浣犲ソ

'''

乱码,而且和上面的乱码一样,这是因为,在uni被utf-8 encode之后,这个对象变成了str对象,是'\xe4\xbd\xa0\xe5\xa5\xbd' 这个。

后来,它又被按照gbk的规则解码,又变回了unicode,但是此时它在内存里的二进制数据已经和最初的uni不一样了。

最初的uni,应该是'\xc4\xe3\xba\xc3'.decode("gbk"),而现在的这个东西,他decode之前的字符串已经变过了。

这么一个东西再拿去print,又把它编码成了gbk格式,相当于前面那步decode没有做,变回了'\xe4\xbd\xa0\xe5\xa5\xbd'。

再解释成汉字,当然就和最开始用uni编码成utf-8格式再解释成汉字的乱码一样了

'''

复制代码

2.2.2 脚本print 打印的正确方式

上面已经证明了系统的默认编码方式是gbk,就是print 最后正确的编码方式应该是gbk

两种解决编码不匹配的情况:

一是明确的指示出 s 的编码方式

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

s = '中文'

s.decode('utf-8').encode('gb2312')

二是更改 sys.defaultencoding 为文件的编码方式

#! /usr/bin/env python

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

import sys

reload(sys) # Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入

sys.setdefaultencoding('utf-8')

str = '中文'

str.encode('gb2312')

三、实践经验中爬取数据的获得

复制代码

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

'''

#加油两个字可以很好的比较编码正确和错误

#### 错误的处理方式,

s = "中文"

print s

#这里print就不是输出gbk的编码,是按照头文件utf-8的格式输出

# 结果:中文

print s.decode('utf-8')

#结果中文,s进行解码称为Unicode,print打印就和系统print打印一样自动将Unicode进行

#解码,不用encode编码也能输出,但是最好转化成为字符串输出。

上面实例就是错误使用编码,错误使用编码会出现个别字体的乱码。

'''

'''

要点1、声明头文件# -*- coding: utf-8 -*- 说明所有的代码和中文是utf-8的编码方式

要点2、print输出函数输出到前台cmd中的默认系统编码方式是GBK,

要点3、尽量将Unicode转化成为字符串str (gbk或者utf-8),再去处理。

#unicode 转化成为字符串

s = u'加油'

print s

#结果:加油。原因:系统自动将Unicode升级gbk编码成为字符串,然后系统print 打印gbk

print s.encode('utf-8')

#结果:锷犳补。错误原因:Unicode 编码成为utf-8的字符串形式,但是print打印系统是gbk的,编码冲突。

print s.encode('gbk')

#结果:加油。原因:和print s等价,认为编码了gbk,系统打印

ss = "加油"

print ss

#结果:锷犳补。原因:ss为utf-8的字符串str,print 打印的对应编码字符串是gbk的,所以编码冲突。

print ss.decode('utf-8').encode('gbk')

#结果:加油。原因:ss首先从字符串编码utf-8解码成为unicode,然后进行编码gbk,等价使用print ss.decode('utf-8')。

'''

'''

3.1python中关于中文转换url编码的问题

爬虫的时候我们经常会碰到中文链接编码出现变换的问题,

例如'丽江'中文在url的地址编码却是'%E4%B8%BD%E6%B1%9F',

因此需 要做一个转换。这里我们就用到了模块urllib。

'''

import urllib

data = '丽江'

print data.decode('utf-8').encode('gbk')

#对utf-8的中文编码

print urllib.quote(data)

#那我们想转回去呢?

print urllib.unquote('%E4%B8%BD%E6%B1%9F').decode('utf-8').encode('gbk')

'''

'丽江'在网页编码是gbk的转换码是'%C0%F6%BD%AD',utf-8中的转化码是'%E4%B8%BD%E6%B1%9F',其实是编码问题。

百度的是gbk,其他的一般网站比如google就是utf8的。所以可以用下列语句实现。

'''

#江苏课题的编码转化

import sys,urllib

s = '江苏'

print urllib.quote(s.decode(sys.stdin.encoding).encode('gbk'))

print urllib.quote(s.decode(sys.stdin.encoding).encode('utf8'))

for place in ['南京','无锡','徐州','常州','苏州','盐城','南通','连云港','淮安','盐城','扬州']:

print urllib.quote(place)

####################

#结果:

'''

丽江

%E4%B8%BD%E6%B1%9F

丽江

%E4%B8%BD%E6%B1%9F

%E6%B6%93%E8%8A%A5%E7%9D%99

'''

python抓取网页内容时出错,UnicodeEncodeError: 'gbk' codec can't encode character '\ue4bf.....

问题是这样的,网页的数据应该是'utf-8'编码,这个可以在网页的head上面看得到,然后你爬网页的时候会把它转化成Unicode,出问题的是在print()这儿,对于print()这个函数,他需要把内容转化为'gbk'编码才能显示出来. 然后解决办法是这样,你在转化后的Unicode编码的string后面,加上 .encode('GBK','ignore').decode('GBk') 也就是先用gbk编码,忽略掉非法字符,然后再译码,是不是很有道理 应该是这样的,因为我和你遇到同样的问题,现在解决了

python3.3中文乱码与默认编码格式设定。

python 3和2很大区别就是python本身改为默认用unicode编码。

字符串不再区分"abc"和u"abc", 字符串"abc"默认就是unicode,不再代表本地编码、

由于有这种内部编码,像c#和java类似,再没有必要在语言环境内做类似设置编码,比如“sys.setdefaultencoding”;

也因此也python 3的代码和包管理上打破了和2.x的兼容。2.x的扩展包要适应这种情况改写。

另一个问题是语言环境内只有unicode怎么输出gbk之类的本地编码。

答按惯例都在(序列化)输出时才转换成本地编码。

比如

file.write("GBK的中文".encode("GBK"))

python环境内字符串用str.encode("GBK")方法输出成字节串用于和其他环境交流。


分享标题:gbk函数python 䶮 gbk
网址分享:http://hbruida.cn/article/dooophd.html