4. 疑难问题解答
编码识别
说了要确定编码,那么拿到一串二进制要怎么确定编码呢?
最简单的方法是chardet:(需要安装)
python -m pip install chardet
使用非常简单:
#coding=utf8
from chardet
import detect
print(detect('这是一串utf8的测试字符'))
# 结果:`{'confidence': 0.99, 'encoding': 'utf-8'}`
另外例如抓取网站,那么头文件中很有可能有提示如何解码,记得不要忘记了。
编码转换
很可能因为字符串中参杂了奇怪的东西,导致即使编码种类正确,依旧无法解码。
我知道我之前讲过了,但可能有人直接跳疑难问题解答嘛。
这里可以使用decode的第二个参数:
#coding=utf8
# 字符串中混进了\x00
rubbishUtf8String = 'Utf-8字\x00符串'
print(repr(rubbishUtf8String.decode('utf8', 'replace')))
print(repr(rubbishUtf8String.decode('utf8', 'ignore')))
特殊平台下编码
很多人都说Windows是个坑,即使在Python 3下面也一样。
因为中文文件名出来都是乱码。
这里使用一个取巧的方法:平台编码再特殊,起码命令行读取和创建一个文件夹不会出乱码吧。
import sys, os
for folder
in os.walk('.').next()[1]:
print(folder.decode(sys.stdin.encoding))
同样的输入输出也可以这样做优化:
import sys
def sys_print(msg):
print(msg.encode(sys.stdin.encoding))
def sys_input(msg):
return raw_input(msg.encode(sys.stdin.encoding)).decode(sys.stdin.encoding)
文件写入
如果抓下来一个内容不知道怎么解码,但还是想要写入文件怎么办
写入文件的时候制定用二进制命令即可:
#coding=utf8
import urllib
with open('Utf8.txt', 'wb')
as f: f.write('Utf8测试')
# 比如抓了个网页,不知道编码也可以写入文件进行一系列操作
content = urllib.urlopen('http://www.baidu.com').read()
with open('baidu.txt', 'wb')
as f: f.write(content)
裸Unicode字符
Unicode存成六个Ascii字符怎么办?其实也可以decode
#coding=utf8
# 这是普通的Unicode
s = u'测'
for i
in s: print(i)
print(repr(s))
# 这是裸Unicode,实际存成了六个Ascii
s = repr(s)[2:-1]
for i
in s: print(i)
print(repr(s))
# 转化其实也很简单
s = s.decode('unicode-escape')
for i
in s: print(i)
print(repr(s))
好了,希望这篇文章对大家解决Python编码问题有所帮助!
本文版权归传智播客Python培训学院所有,欢迎转载,转载请注明作者出处。谢谢!
作者:传智播客Python培训学院
首发:http://www.itcast.cn/Python/