热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

看透“0”、“1”逻辑,轻松解决Python中文乱码

看透“0”、“1”逻辑,轻松解决Python中文乱码,Go语言社区,Golang程序员人脉社

Python中关于“中文乱码”的问题,现规整如下,并统一回答



同学问:

jacky:我在爬取XX网站信息的时候,中文怎么总是显示的乱码?

jacky:UTF-8与GBK到底是个啥?

jacky:我用的是Mac系统,网上说Python3中默认的编码是UTF-8,可我显示中文时怎么还是乱码?



(一)逻辑导图
Created with Raphaël 2.1.0Python中为什么会出现乱码?解码与编码方式不一致解码与编码具体方式有哪些?实质是什么?Python乱码问题总结


(二)基础铺垫

1.计算机的底层逻辑


Created with Raphaël 2.1.0生活、交易、娱乐、科学研究,都离不开计算机(广义)。无所不能的计算机是怎样实现其功能的?通过计算机语言编码实现的(Python就是其中之一)。那么语言编码又是怎样构成的?计算机语言是由字母,字符和数字组合而成的,不同的排列组合,构成了不同的语言要素,其排列组合的规则就是编码语言的语法接下来,我们要探讨,这些规则是如何制定的?水印:@数据分析-jacky通过0和1的不同组合,若干个0和1,若干种组合,我们制定了编码语言的不同规则为什么只是0和1的组合?这里的0和1,也只是辅助我们标记计算机规则的标记的是什么?标记电路最底层的两种状态:通电和不通电标记电路最底层的两种状态:通电和不通电计算机底层就是电路,现阶段,人类处理电路可能的办法只能是让它通电,或不通电。人类是多么的伟大仅用0和1,就构建了我们现在这个机器智能的世界


2.字符编码

计算机只认二进制的“0”和“1”


ASCII



  • 这个世界的规则就是谁发起,谁定规则。计算机是美国人发明的,在开发计算机的时候,美国人只考虑到了英文的兼容性,并没有考虑包括中文在内的其他语言。


  • 英语构成计算机最底层的元素就是:26个英语字母,加上特殊字符,加上数字。


(1)发明计算机时,字符编码使用的是ascii码,包括Python2默认的字符编码就是ascii码(Python3默认使用的是UTF-8,详见下文);

(2)ascii码为1字节(8位)


  • 8位二进制(例如:01010101)有多少种排列组合? 28 =256种可能


  • 对于英文来说,8位二进制足够用了,所有python2还默认ascii码也不足为奇。


Unicode(万国码)



  • 全球化和科技共享,让计算机的开发者认识到,要开发一种各国语言都能兼容的编码,就有了unicode,也叫万国码。

(1)unicode 包含各国所有的语言文件和符号,对于中文来说,8位已经不够用了,unicode规定:一个中文汉字最少用3个字节来表示。


  • 一个字节是8位,1byte=8bit=01010101,一个汉字最少有2的24次方种组合

(2)Python中可以用bin函数将十进制转化为二进制

bin(82)
'0b1010010' #b表示的R是二进制

@数据分析-jacky

(3)万国码的弊端


  • 占内存和硬盘


    • 用英文字母R举例:如何用ascii码表示为’0b1010010’,如何用万国码表示为

      ‘000000000b1010010’,因为万国码,最少是2个字节,与ascii相比,万国码白白浪费了1个字节的空间。

  • 针对unicode的弊端,如今的开发者,又对unicode进行了精简,开发了UTF-8编码


(4)特别说明(读完下文在回来看,就好理解了)


  • Unicode是Python的内部编码,也是编码和解码的中间编码。

UTF-8编码



  • UTF-8编码是对unicode 的一个再加工
    • 对unicode 的编码进行了划分和整理,用8位的就划分为用8位的,不额外在用空间

  • 规则:
    • 英文:8位

    • 欧洲:16位

    • 中文:24位

  • 特别说明:在Unicode编码方式下,才存在 utf-8,utf-16,utf-32的编码方式,这句话对于解释下文的解码与编码特别重要


GBK编码










UTF-8 GBK(@数据分析-jacky)
外国人开发 中国人开发
外国人看不会乱码 外国人看会乱码
一个汉字占3个字节 一个汉字占2个字节

(三)编码与解码

1、基础内容



编码:将字符转化为二进制字节的过程

解码:将二进制字节转化为字符的过程



Created with Raphaël 2.1.0

字符字符

二进制字节二进制字节

编码(字符转化为字节的过程)

可逆过程解码


Created with Raphaël 2.1.0UTF-8|GBKUTF-8|GBK

Unicode中间编码Unicode中间编码

encode 编码

可逆decode 解码


2、解码和编码的实现方法


(1) 基本逻辑



字符串在Python内部的表示是Unicode编码。

因此在做编码转换时,通常需要以Unicode作为中间编码,即先将其他编码的字符串解码(decode)成Unicode,再从Unicode编码(encode)成另一种编码。



(2) encode与decode



decode的作用是将其他编码的字符串转换成Unicode编码,如str1.decode(‘gbk’),表示将gbk编码的字符串str1转换成Unicode编码;

encode的作用是将Unicode编码转换成其他编码的字符串,如str2.encode(‘UTF-8’),表示将Unicode编码的字符串str2转换成UTF-8编码



因此,使用Python转码的时候一定要先搞明白,字符串str是什么编码,然后decode成Unicode,然后再encode成其他编码。


特别注意:



  • 如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断:


  • 用非unicode编码形式的string来encode也会报错



(3)支持字符串类型的两种数据模型



python编码有两种数据模型来支持字符串类型 :



  • 一种是str ;

  • 一种是unicode


(四)解决Python乱码的思路
Created with Raphaël 2.1.0乱码?Unicode中转码我们需要的编码方式

代码的实现方式:

decode()->unicode->encode转化为需要的格式

实战案例:

content为从文件中读取的gbk编码的内容,我们通过以上方法输出该内容。

content.decode('gbk').encode('utf-8')

  • decode方法将content内容转为unicode格式

  • encode方法将unicode格式的数据转化为自己所需要的编码方式。

(五)数据科学领域需注意的问题

作为数据分析(挖掘)师,python与数据库的关联是最常见的,我们用python连接数据库后,将数据写到数据库里的中文有时会是乱码


解决办法是在python文件中加上这样几句话:

conn.set_character_set('utf8')
cur.execute('SET CHARACTER SET utf8')
cur.execute('SET character_set_cOnnection=utf8')

  • conn是数据库的connection,cur是connection的光标cursor



推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • 本文介绍了使用Python编写购物程序的实现步骤和代码示例。程序启动后,用户需要输入工资,并打印商品列表。用户可以根据商品编号选择购买商品,程序会检测余额是否充足,如果充足则直接扣款,否则提醒用户。用户可以随时退出程序,在退出时打印已购买商品的数量和余额。附带了完整的代码示例。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • “你永远都不知道明天和‘公司的意外’哪个先来。”疫情期间,这是我们最战战兢兢的心情。但是显然,有些人体会不了。这份行业数据,让笔者“柠檬” ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 本文总结了解决python文件读写乱码问题的方法。其中包括错误的打开方式和正确的打开方式,并提供了相应的代码示例。建议在进行写入操作后先将文件关闭,然后再打开,最后再读取文件。若文件编码是utf-8,则需要在读取文件时添加decode('utf-8')。这样操作可以避免在打开记事本时出现乱码问题。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • Google在I/O开发者大会详细介绍Android N系统的更新和安全性提升
    Google在2016年的I/O开发者大会上详细介绍了Android N系统的更新和安全性提升。Android N系统在安全方面支持无缝升级更新和修补漏洞,引入了基于文件的数据加密系统和移动版本的Chrome浏览器可以识别恶意网站等新的安全机制。在性能方面,Android N内置了先进的图形处理系统Vulkan,加入了JIT编译器以提高安装效率和减少应用程序的占用空间。此外,Android N还具有自动关闭长时间未使用的后台应用程序来释放系统资源的机制。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
author-avatar
mobiledu2502862707
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有