python 编码gbk_Python处理不同编码utf8和gbk的问题

匿名用户

1级

2017-01-15 回答

有。

使用chardet库。它会去猜测文本文件的编码,并返回形如:

编码类型:utf-8

置信度:0.9

这样的结果,也就是说chardet断定该文件有90%的可能性是utf-8编码的。

不过chardet的缺陷就是,它不能完全100%确定文件的编码类型。

目前我的做法是,如果置信度超过0.95,那么就认定chardet的判断结果是正确的。否则,再加上一些人机交互操作进行判断。

目前,chardet库官网提供的版本只适用于Python 2,如果您使用的是Python 3.x,我可以另外上传一个。

追问:

我原来写过一个

s=open(path)

s.seek(0)

signature = s.read(3)

if signature.encode('hex') == 'efbbbf':

pass

else:

s.seek(0)

能不能根据这个改下? efbbbf是什么编码 不是utf8吗 为什么我写了之后还是不管用呢

追答:

1. 文件打开后,文件位置指针就位于文件开头部分,所以s.seek(0)这个调用可以不要。

2. encode('hex')在Python 3.3中有错。在Python2.7中,encode('hex')会产生signature的十六进制形式的字符串。比如'abc'.encode('hex')将得到:'616263'。

3. 在Python 3中,如果源程序中没有额外的编码类型声明,那字符串字面量是utf-8编码的(Python 3.x不再有string 和 unicode string之分)。在Python 2.7中,字符串分普通的和unicode的。

追问:

前两个你说的我明白  第三个不明白

我现在有几个问题

1. 这样写能不能做到转码的需求?

2.efbbbf是utf8用的吗?

追答:

EF BB BF确实是utf-8的BOM,但是并不是所有以UTF-8编码的文本文件都有BOM的。

追问:

那我要用代码转换 怎样转 不能用你说的那个

我的代码是意思

将指针指向第三个字节位置 判断txt开头是不是utf8的

是的话 就从第四个字节开始读

不是的话 则将指针指回0

追答:

刚用了下Python 2.7,发现open函数没有encode参数。

所以,我这样解决:

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

words = u'您好'

# 生成以gbk编码的测试文件

fp = open('file.txt', 'w')

fp.write(words.encode('gbk'))

fp.close()

# 读取gbk文件

fp = open('file.txt')

words = fp.read()

fp.close()

print words

# 先解码,再按照新的编码类型重新编码,并写入文件

words = words.decode('gbk')

fp = open('file_utf-8.txt', 'w')

fp.write(words.encode('utf-8'))

fp.close()

追问:

你还是没有明白我的意思 我不是要问转码

我的意思是 先判断是什么编码 我主要想知道是这个过程

至于重新编码并写入 这个想法根本就不现实

我一个txt就要1G 若这个 很浪费空间 再说 这个等于又新建了一个

追答:

如果单纯判断编码类型的话,前面我已经提过chardet。而且这个库使用起来一点都不难(你需要了解的不超过3个函数)。

如果您的文件编码类型只可能是gbk或者utf-8的话,自己判断也可以。

1. 如果文件以UTF-8编码,并且确认它包含BOM,那么上面您给出的那段代码就可以用。如果没找到BOM就判定为gbk的(而且,这种情况下,以)。

2. 如果文件是以UTF-8的,但是没有BOM的话,上面的方法就不起作用了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值