一步一步搞定Python3.6编码问题

Python中的编码问题很蛋疼,我们遇到这类问题有时候会使用下面几个步骤处理该问题:

1:这么低级问题,别问同事了太丢人,赶紧百度;

2:卧槽,出了一堆广告,骂个娘,赶紧找相关解决问题方式;

3:尼玛,终于搞定,原来这么简单,赶紧搞定其它工作,晚上回头在查原因;

4:傻B单位每天加班,到家都11点了,赶紧洗洗睡了;等会,先来局王者农药......

5:编码问题早就忘了;

6:过了几天又出现编码错误,,从第1步开始重新来过。

今天我们就花一局王者农药时间搞定Python3.6的编码问题。

  1. 搞清楚编码格式:

    1)编码格式:utf-8, gbk, gb2312, unicode...

    计算机和编码关系:计算机如何显示打印文字:中文,英文等。计算机不能识别字符,那么它如何显示?

    计算机可以读取数据,于是我们前辈就弄一个字模,通过01标识把这个字符给他画出来,然后使用一个二进制码和这个字模对应起来,这样,计算机就能根据这个二进制码把这个字符显示出来了。

    计算机 -> 编码 -> 字模点阵 ->显示,打印等。

    2)为什么那么多编码格式?

    计算机是美国人发明的,他们只需要使用英文字符和常用符号,于是ascii(256)就足够了;

    后来计算机普及了,中国人想让处理汉字,日本人想让他处理日文,阿拉伯人想让他处理阿拉伯语,于是就有了各种编码格式;比如gb2312,;但是gb2312表示一个字符需要2个字节,这样表示一个英文字符有点浪费,于是大牛们整出了utf-8,utf-16等可变长编码格式。

    出现了太多的编码格式,让人蛋疼,于是大牛们同意规范,又整出了unicode编码格式,支持所有的语言。

    到这里,可能明白编码格式了。

    3)编写一个txt文件,内容为:"中国",他存储的是“中国”这个汉子么,还是??

    1: 借助工具看一哈:

    文件内容:中国

    文件存储内容:二进制数字:D6D0 B9FA

    文件编码格式:gbk

    2:修改下软件编码格式:utf-8

    乱码有么有。

    为什么乱码?因为文字存储编码格式为gbk,我们指定软件编码格式utf-8,然后问题出现了:

    软件去utf-8的编码表里找不到D6D0 B9FA对应的字模,或者找错了,所以会乱码。

  2. Python中编码格式问题

    1:Python内置存储格式为unicode

    2:字符流和字节流问题:

    1)字符流:程序内部使用,不能直接保存文件;str类型;

    2)字节流:保存文件,网络传输;byte类型;

    3:Python中的编码格式转换

#Python3.6
>>> s = ‘中国‘
>>> s.decode(‘utf-8‘)
Traceback (most recent call last):
  File "<pyshell#21>", line 1, in <module>
    s.decode(‘utf-8‘)
AttributeError: ‘str‘ object has no attribute ‘decode‘
>>> u8 = s.encode(‘utf-8‘)
>>> u8
b‘\xe4\xb8\xad\xe5\x9b\xbd‘
>>> u8.encode(‘utf-8‘)
Traceback (most recent call last):
  File "<pyshell#24>", line 1, in <module>
    u8.encode(‘utf-8‘)
AttributeError: ‘bytes‘ object has no attribute ‘encode‘
>>> u8.decode(‘utf-8‘)
‘中国‘
>>>

python3.6版本中,s为unicode,是字符串类型,没有decode方法,所以做解码失败;

u8是s使用utf-8编码后的数据,没有encode方法;

u8可以使用decode方法解码成unicode,如果解码格式为其它,我们可以看看结果:

>>> u8.decode(‘gbk‘)
Traceback (most recent call last):
  File "<pyshell#27>", line 1, in <module>
    u8.decode(‘gbk‘)
UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xad in position 2: illegal multibyte sequence

常见解码错误:UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xad in position 2:

原因:u8的编码格式是utf-8,我们使用gbk去解码,造成该错误。

编码格式之间转换:(gb2312,utf-8...)->unicode ->(gb2312,utf-8...);

unicode是中间的桥梁。

4:文件打开问题(环境:window下):

将一个文本文件存储为utf-8编码,

>>> f = open(‘readme.txt‘)
>>> f.read()
Traceback (most recent call last):
  File "<pyshell#35>", line 1, in <module>
    f.read()
UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xbd in position 8: incomplete multibyte sequence

将文件打开,读取的时候为什么会有问题;

1)文件存储形式字节,读取的时候是字节,编码格式为Utf-8

2)读取文件时候,read方法会做一个解码操作,但是他是什么形式解码呢?查看帮助文档:

>>> help(open)
Help on built-in function open in module io:

open(file, mode=‘r‘, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
    Open file and return a stream.  Raise IOError upon failure.
    .....
>>> f
<_io.TextIOWrapper name=‘readme.txt‘ mode=‘r‘ encoding=‘cp936‘>

这里可以看到,f的编码格式"cp936",这个和gbk是一样的编码格式,到这里知道为啥会出错了吧,文件存储字节是utf-8编码,解码使用gbk方式,所以会出错,在open的时候指定编码格式utf-8再来一次试试:

>>> f = open(‘readme.txt‘, encoding=‘utf-8‘)
>>> line = f.readline()
>>> line
‘\ufeff中国‘
>>> print (line)
中国

读取成功,"\ufeff"是window下utf-8文件编码格式头。到这里我们就基本搞清楚常见的编码问题了。

5:文件存储问题:

一个栗子:

>>> f = open(‘test.txt‘, ‘w‘)
>>> f.write(‘中国‘)
>>> f.close()

传的参数为字符流,但实际存储为字节流,

>>> f = open(‘test.txt‘, ‘rb‘)
>>> f.read()
b‘\xd6\xd0\xb9\xfa‘

自己搞搞:使用utf-8方式打开test.txt, 然后读取出现什么问题?

好了到这里,编码基本就到这里,如果还有不清楚的可以参考俺的视频课程:

http://edu.51cto.com/course/8983.html,第二章内容。

另外,俺的水平有限,如果错误欢迎指正。

时间: 2024-10-17 20:11:09

一步一步搞定Python3.6编码问题的相关文章

如何将CAD图纸转换成彩色,只需几步即可轻松搞定!

如何将CAD图纸转换成彩色,只需几步即可轻松搞定!在日常的工作中,建筑设计师们在编辑器完图纸后,基本图纸都是黑白的,这样不利用我们更好的进行查看,那就需要将CAD图纸的颜色进行转换,如何将CAD图纸转换成彩色,具体要怎么操作了?本篇教程就教教大家在迅捷CAD转换器中如何将CAD图纸转换成彩色只需几步的具体操作方法,想要了解的朋友就感觉来看看吧! 第一步:打开常用电脑,在电脑桌面中任意的打开一个浏览器,在浏览器的搜索框中搜索迅捷CAD转换器,然后鼠标点击进入官网,点击 下载安装最新版本的CAD转换

CAD转换PDF简单几步就能够搞定

CAD制图是一个复杂的过程,里面凝聚了建筑工程师的心血.按照自己的想法完成CAD制图工作后,很多人选择将CAD图纸转换成PDF格式,这样更加便于预览.可CAD图纸怎么转换成PDF格式呢?本篇就教大家简单几步搞定CAD转换PDF. 请下载安装迅捷CAD编辑器,软件安装完成后,请直接打开运行,进入软件操作界面. 将CAD转换成PDF有两种方法,可以单个文件转换,也可以批量转换. 1.如果您刚刚绘制完成CAD文件,或是打开了一个CAD文件编辑后,想要直接将CAD保存成PDF文件,那么可以使用以下方法:

十步!轻松搞定IIS+PHP环境

突然心血来潮想着自己一直使用Apache+php的模式,想要了解一下IIS+php的模式.说起来也算是九曲十八弯吧! 第一部分:以ISAPI.dll 扩展的形式 结果按照资料上面说的我就是找不到一个isapi.dll这个东西,只有nsapi.dll,最后一查才知道:php5.3以后就不支持这种形式的搭建了. php5.3是不能在IIS6上面通过ISAPI扩展运行的,而且在php5.3文件里面也没有php5.3isapi.dll,取而代之的是php5.3nsapi.dll,换句话说php5.3以后

电脑上误删的文件怎么恢复?轻松几步就能搞定

电脑上误删的文件怎么恢复?目前来说,电脑的删除方式分为两种:普通删除和永久删除,普通删除的文件会出现在回收站中,只要能够找到就可以进行还原的操作,那永久删除的文件该怎么进行恢复呢? 普通删除文件的还原操作相信都会,那么对于永久删除文件的恢复方式不知道各位有掌握几种呢?其实有挺多人说使用数据恢复软件恢复不了误删的文件,那或许各位使用的不是专业数据恢复软件吧,下面小编就和各位来分享数据恢复软件吧: 步骤一:打开常用电脑的浏览器搜索[互盾数据恢复软件]的安装包,然后下载到电脑上,点击[立即安装]来完成

六步轻松搞定,自建APP不求人

随着互联网浪潮的席卷,越来越多的传统企业开始涉足互联网领域.无论是出于企业转型升级考虑,还是受市场整体环境的驱动,很多企业凭借某一领域的绝对优势,浩浩荡荡进军移动互联网领域,通过自建APP的方式,推出属于自己的移动端应用产品. 不少企业在探寻如何自建APP的过程中,遇到的第一个决策性难题就是:自建APP开发团队还是外包APP建设?其实对于大多数企业而言,由于企业内部组织架构设置问题,尚没有配备完善的自建APP开发团队,同时财政预算有限,难以承担整体自建APP工作.对于这类中小型企业而言,如何能够

redha7.2配置静态网卡(三步搞定)

三步搞定: 编辑网卡配置文件:vi /etc/sysconfig/network-scripts/ifcfg-eno16777736(也可能是eth0或eth1或者eth+任何数字) 当前是DHCP,如果要使用静态IP修改: BOOTPROTO=static                #声明IP地址获得的途径 ONBOOT=yes                          #开启自动启用网络连接 增加: IPADDR=192.168.1.1              #设置IP地址(

SmaterWeatherApi---签名加密和数据访问--简单粗暴一步搞定

使用中国天气网接口的朋友们,大家(还有我)辛苦了 有兴趣的可以去了解一下http://smart.weather.com.cn/wzfw/smart/weatherapi.shtml 年初的时候停用了之前的接口,改为申请使用,于是发个了申请邮件,中间各种曲折...一万字.. 总算是申请下来了,不过接口文档啊,看的我累觉不爱,文档上只有php版的kay生成方法,我在androi上使用,那些加密方法不知道用java如何实现 一怒之下,就写个php版的吧,本来是只想写个生成key的接口的,后来想了想

iOS开发三步搞定百度推送

iOS开发三步搞定百度推送 百度推送很简单,准备工作:在百度云推送平台注册应用,上传证书. 步骤一: 百度云推送平台 http://push.baidu.com/sdk/push_client_sdk_for_ios  在这里下载iOS端SDK包,如下图: 把SDK包里面的下图文件夹拖到你的工程中,如下图,第一步就这么简单. 步骤二: 在工程中AppDelegate.m中的- (BOOL)application:(UIApplication *)application didFinishLaun

10步搞定App内测发布(蒲公英内测平台)

10步搞定App内测发布(蒲公英内测平台) (写作不易,转载请注明出处,谢谢!) App内测是必不可少的一个环节,重中之重! 有两种方法:一.把每台手机的插到开发人员的电脑上跑一边(不推荐):二.通过第三方分发平台(推荐),可以把自己的App发布到第三方的平台上,供内部员工下载,就不需要每台机子都到开发人员的电脑上跑一遍! 现在博主(最近看博客,博主都这样称呼自己)就来谈谈第二种方式,平台使用蒲公英平台: 1.开发者账号,Must: 2.要测试的iPhone.iPad真机的UDID填写到Deve