看透“0”、“1”逻辑,轻松解决Python中文乱码
Python中关于“中文乱码”的问题,现规整如下,并统一回答
同学问:
jacky:我在爬取XX网站信息的时候,中文怎么总是显示的乱码?
jacky:UTF-8与GBK到底是个啥?
jacky:我用的是Mac系统,网上说Python3中默认的编码是UTF-8,可我显示中文时怎么还是乱码?
(一)逻辑导图
(二)基础铺垫
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是二进制
(3)万国码的弊端
占内存和硬盘
- 用英文字母R举例:如何用ascii码表示为’0b1010010’,如何用万国码表示为
‘000000000b1010010’,因为万国码,最少是2个字节,与ascii相比,万国码白白浪费了1个字节的空间。
- 用英文字母R举例:如何用ascii码表示为’0b1010010’,如何用万国码表示为
针对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、基础内容
编码:将字符转化为二进制字节的过程
解码:将二进制字节转化为字符的过程
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乱码的思路
代码的实现方式:
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
看透“0”、“1”逻辑,轻松解决Python中文乱码的更多相关文章
- 解决python中文乱码的方法
首先需要说明的是,windows下的文件路径,cmd窗口等默认编码都是gbk 但在windows下编写python程序的时候,我们一般采用的编码是utf-8 二者不一致是导致乱码的根本原因! 在pyc ...
- Hession集成Spring + maven依赖通讯comm项目 + 解决@ResponseBody中文乱码
hessian结合spring的demo hessian的maven依赖: <!-- hessian --> <dependency> < ...
- 解决mysql中文乱码问题?
mysql是我们项目中非常常用的数据型数据库.但是因为我们需要在数据库保存中文字符,所以经常遇到数据库乱码情况.下面就来介绍一下如何彻底解决数据库中文乱码情况. 1.中文乱码 1.1.中文乱码 cre ...
- 彻底解决mysql中文乱码
mysql是我们项目中非常常用的数据型数据库.但是因为我们需要在数据库保存中文字符,所以经常遇到数据库乱码情况.下面就来介绍一下如何彻底解决数据库中文乱码情况. 1.中文乱码 1.1.中文乱码 cre ...
- 彻底解决matplotlib中文乱码问题(转)
彻底解决matplotlib中文乱码问题 1.环境查看a.系统版本查看[hadoop@p168 ~]$ cat /etc/redhat-releaseCentOS Linux release 7.2. ...
- Python 中文乱码matplotlib乱码 (Windows)
Python解决matplotlib中文乱码问题(Windows) matplotlib是Python著名的绘图库,默认并不支持中文显示,因此在不经过修改的情况下,无法正确显示中文.本文将介绍如何解决 ...
- 在Visual Studio Code 中配置Python 中文乱码问题
在Visual Studio Code 中配置Python 中文乱码问题 方法一:直接代码修改字符集 添加前四行代码 import io import sys #改变标准输出的默认编码 sys.std ...
- 解决Eclipse中文乱码 - 技术博客 - 51CTO技术博客 http://hsj69106.blog.51cto.com/1017401/595598/
解决Eclipse中文乱码 - 技术博客 - 51CTO技术博客 http://hsj69106.blog.51cto.com/1017401/595598/
- Ubuntu14.04安装中文输入法以及解决Gedit中文乱码问题
1 设置中文显示环境 1. 打开System Settings 2. 打开Personal-> Language Support. 会弹出如下对话框,提示你“语言支持没安装完整”. 点击“Rem ...
随机推荐
- oracle导入时IMP-00010: 不是有效的导出文件, 头部验证失败
头部验证失败是由于版本号不同所致,经试验可以通过如下方法进行修改:用notepad++工具打开dmp文件,可以看到头部信息 --TEXPORT:V11.01.00,即为源数据库的版本号,将其修改为目的 ...
- HTML Ueditor加载空白问题
问题描述 Ueditor打开时加载不出内容 原因分析 Ueditor重复加载时,会存在缓存问题 Ueditor采用异步加载方式,所以数据获取和赋值要写在Ueditor异步回调里 解决方案 UE.del ...
- Spring Cloud(七)服务网关 Zuul Filter 使用
上一篇文章中,讲了Zuul 转发,动态路由,负载均衡,等等一些Zuul 的特性,这个一篇文章,讲Zuul Filter 使用,关于网关的作用,这里就不再次赘述了,重点是zuul的Filter ,我们可 ...
- 如何使用cgdb(一)——窗口切换
cgdb是一个轻量级的基于控制台的多窗口gdb调试界面.除了标准的gdb控制台之外,cgdb还提供了一个分屏视图,可以在执行的时候显示具备语法高亮的源代码.键盘控制是仿照vim设计的,所以vim用户使 ...
- (备忘)Linux mount(挂载命令)详解
挂接命令(mount) 首先,介绍一下挂接(mount)命令的使用方法,mount命令参数非常多,这里主要讲一下今天我们要用到的. 命令格式:mount [-t vfstype] [-o option ...
- 如何正确清理C盘?
Windows电脑操作系统一般是安装在磁盘驱动器的C盘中,一旦运行,便会产生许多垃圾文件,C盘空间在一定程度上都会越来越小.伴随着电脑工作的时间越久,C盘常常会提示显示其内存已不足.那么C盘容量不足对 ...
- CHANGELOG 的实现
项目需要写版本信息时有对除了版本号之外更详细的 changelog 的展示, 于是就需要在平时的 git commit 中进行规范, 才能自动生成CHANGELOG.md. Husky 首先本地安装 ...
- Collection 和 Collections 有什么区别?(未完成)
Collection 和 Collections 有什么区别?(未完成)
- StringBuffer常用方法
StringBuffer常用的方法 package com.mangosoft.java.string; /** * 字符串特点:字符串是常量,它们的值在创建之后不能更改. * * 字符串的内容一旦发 ...
- java线程基础巩固---如何实现一个自己的显式锁Lock
拋出synchronized问题: 对于一个方法上了同锁如果被一个线程占有了,而假如该线程长时间工作,那其它线程不就只能傻傻的等着,而且是无限的等这线程工作完成了才能执行自己的任务,这里来演示一下这种 ...