Python中关于编码的几个疑问,搞糊涂了。
def encoding(dm):
>>types = [‘utf-8’,‘utf-16’,‘gb2312’,‘gbk’]
>>for type in types:
>>>>try:
>>>>>>return dm.decode(type),type
>>>>except:
>>>>>>pass
htmlstr = urllib.request.urlopen(htmlstr).read()
htmlstr,htmltype = encoding(htmlstr)
这是从网上找的代码,是先取到页面代码,然后用 encoding 判断代码的编码,是用试错法,从几个编码里挨个试,如果不能转换就换下一个,直到找到为止。我在执行完这一步就把页面代码存入数据库了,但是直接上传到自己的网站上时显示乱码,必须用 btstr = btstr.encode(‘gbk’)转成 gbk 才能正确显示内容,我的网站是 utf-8 编码,系统是 xp , python34 , sublime3 ,数据库是 access ,步骤就是这样。
我现在奇怪的是上面代码中 return dm.decode(type),type 这句到底起什么作用?
如果对方网站是 utf-8 编码,那么 dm.decode(‘utf-8’)是解码成 unicode ?
把这个网页代码存入数据库时是什么编码?
为什么上传的时候必须要编码成 gbk 才能显示呢?
Python中关于编码的几个疑问,搞糊涂了。
帖子内容呢?没内容我咋知道具体是啥编码问题。
常见的编码坑就那几个:
- 文件读写:用
open('file.txt', 'r', encoding='utf-8')指定编码,别用默认的。 - 字符串处理:Python3里字符串是Unicode,
str.encode()转成bytes,bytes.decode()转回来。乱码多半是编解码不一致。 - 控制台/IDE显示:Windows终端用GBK,Linux/macOS用UTF-8,输出前先确认环境编码。
- 网络数据:requests库拿到的内容看
response.encoding,不对就手动response.content.decode('正确编码')。
给个例子,读可能带BOM的UTF-8文件:
import codecs
with codecs.open('file.txt', 'r', 'utf-8-sig') as f:
content = f.read() # 自动去掉BOM头
print(content)
总结:统一用UTF-8,处理外部数据时显式指定编码。
刚才从数据库里取出来字符串再做个测试,结果也是 utf-8 。
首先明确两个概念:
* 字符串(string),在 Python 3 中是 ‘abc’ 或 str()
* 字节流(binary),在 Python 3 中是 b’abc’ 或 bytes()
然后记清:
* str.encode() -> bytes
* bytes.decode() -> str
urlopen().read() 返回 bytes
你的 encoding 函数是通过 try 的方式找到正确的编码,然后 decode 成 str 同时返回对应编码名
把 str 值存入数据库时,要看数据库对应字段数据类型,一般 driver 会自动处理。建议选择支持 Unicode 存储的数据类型。
你可以在数据库里查看存储的字符串值对不对。
最后就是从数据库里读出字符串在网站显示,一般网站框架会自动处理。
刚才从数据库里取出字符串用 encoding 做了个测试,全都是 utf-8 ,话说应该是 unicode 才对啊。
既然数据库中的是 utf-8 ,那上传时不需要再转码啊
全程 utf8 ,我用 py3 后就没出现过编码问题了。
htmlstr, htmltype = encoding(htmlstr)
这句执行完, type(htmlstr) 应该是 str
你从数据库取出来后, type 是什么?
另外你的 encoding 函数,如果 4 种情况都出错,会走 pass ,不 return 结果。
识别字符编码可以考虑用 cchardet 。
单机数据库选 sqlite 比 access 好,除非有特殊需要。
你从数据库取出来后, type 是什么?
这里的 type 就是 utf-8 ,数据库连接我用的 pypyodbc ,好像也没找到有需要设置编码的地方。
py IO 显示是 unicode 吧
存储是用 UTF-8 ,显示是根据你终端的编码来的吧
decode 的参数是现在的类型,都是转成 unicode
感觉最好还是用 py3 , py2 编码太坑了
这段代码有点意思, decode 函数怎么会知道你输入的字串的编码? 如果这个字串的某些字符不再这个编码的范围内, decode 才会报错啊。 不同的 code page 都是可能有相同的编码的啊。换言之, 就算用了错误的 encoding type , decode 函数还是有可能不会报错的, 只是得到的字符串并不是你期望得到的。


