Python3.X-文本编码问题
1.请说明python2与python3的默认编码是什么?
python的默认编码是ASCII码,python3的默认编码是utf-8
2.为什么会出现中文乱码?能列举出现乱码的情况有哪几种么?
编码的方式和解码的方式不一致,就会出现乱码现象。
比如:(1)文本内容是以gbk编码的,但是解码的方式却是utf-8,就会乱码
(2)文本内容是以ASCII进行编码的,那就不支持中文,如果往文本中添加中文,就会显示乱码.
解决方法:用chardet获取编码格式
- import chardet
- str = "xxxxx"
- str_type = chardet.detect(str)
- code = str_type['encoding']
code即为str的编码格式。但有些人反映该方法得到的编码格式不准确,速度也慢。本人亲测,速度确实一般,但是目前还没遇到不准确的情况。大家可以斟酌使用,我这里只是提供一个思路,如果谁那里有更好的方式,可以告知小弟,不吝赐教。
3.如何进行编码转换?
运用 encode(编码)和decode(解码)
decode是解码,从二进制编码格式到unicode编码格式,解码的格式需要以最开始编码的方式一致,否则出现乱码
encode是编码,从unicode格式到二级制编码格式(可以是gbk,utf-8等等)
- # -*- coding:utf-8 -*-
- str = "你好" #py3默认编码是utf-8
- print('unicode:', type(str),str)
- str = bytes(str, encoding='utf-8') # 先编码,转换成bytes二进制类型
- print(type(str), str)
- str = str.decode("utf-8") #再解码,若这个地方写gbk,就会出现乱码错误
- print('用utf-8编码成bytes类型,再解码成unicode:',type(str), str)
- str=str.encode("gbk")
- str=str.decode('gbk')
- print('用gbk编码成unicode,再解码:', type(str), str)
4. # -*- coding:utf-8 -*- 这句话的作用是什么?
文本编码方式默认为utf-8
5.解释py2 bytes vs py3 bytes的区别
(1)Python 3 所有的 strings 均是 unicode 类型,如果要转换成bytes类型,则需要进行编码声明,比如:
- str ⇒ bytes:bytes(s, encoding='utf8')
- bytes ⇒ str:s.decode('utf-8')
在python2.x 中是不区分bytes和str类型的,str的所有操作bytes都支持。但是在python3中bytes和str中是区分开的。
python2 中
>>> s = "abcdefg"
>>> b = s.encode() #或者使用下面的方式
>>> b = b"abcdefg"
>>> type(b)
<type 'str'>
python3中 #str和bytes是严格区分的
>>> s = "abcdefg"
>>> type(s)
<class 'str'>
>>> b = b"abcdefg"
>>> type(b)
<class 'bytes'>
str是文本系列,bytes是字节系列
文本是有编码的(UTF-8,GBK,GB2312等)
字节没有编码
文本的编码指的是字符如何使用字节来表示组织方式,linux下默认都使用UTF-8
(2)bytes与str之间的转换-------编码
bytes由str通过encode方法转化得到的,str也可以通过bytes 通过decode方法转化得到
通过b前缀可以定义bytes
GBK 是双字节,UTF-8 灵活编码,1字节,2字节,3字节,4字节都有,最大支持6字节长度,中文大多数是3字节
>>> S = "我是中国人"
>>> S
'我是中国人'
>>> b = S.encode() #进行编码为bytes
>>> b
b'\xe6\x88\x91\xe6\x98\xaf\xe4\xb8\xad\xe5\x9b\xbd\xe4\xba\xba'
>>> b.decode() #进行解码为字符串
'我是中国人'
>>>
str被编码成什么格式的,就需要使用什么格式的编码进行解码
>>> S = "我是中国人"
>>> S
'我是中国人'
>>> b = S.encode('GBK')
>>> b
b'\xce\xd2\xca\xc7\xd6\xd0\xb9\xfa\xc8\xcb'
>>> b.decode('GBK')
'我是中国人'
(3)bytes的操作
bytes具有string类型的所有操作,bytes可以通过str encode转化,也可以通过前缀b定义
>>> b = b'abc'
>>> b
b'abc'
>>> b.decode()
'abc'
>>> len(('我是中国人').encode()) #求bytes的长度
15
>>> b
b'abc'
>>> b.hex() #转化为16进制
'616263'
>>> bin(616263) #转化为2进制
'0b10010110011101000111'
6.文件处理
(1)读取文件是,r和rb的区别是什么?
对于 Python 3 环境:
r
:Python 将会按照编码格式进行解析,read()
操作返回的是str
rb
:也即 binary mode,read()
操作返回的是bytes
(2)解释一下open中三个参数的作用。
open(f_name,'r',encoding="utf-8")
第一个位置参数f_name指的是打开的文件的名字。
第二个位置参数‘r’指的是用读模式打开。
第三个位置参数encoding='utf-8',指的是读取文件的编码格式为:utf-8
Python3.X-文本编码问题的更多相关文章
- python3中的编码
python2字符串编码存在的问题: 使用 ASCII 码作为默认编码方式,对中文处理不友好 把字符串分为 unicode 和 str 两种类型,将unicode作为唯一内码,误导开发者 python ...
- 转 python3中SQLLIT编码与解码之Unicode与bytes
#########sample########## sqlite3.OperationalError: Could not decode to UTF-8 column 'logtype' with ...
- python3 之 字符串编码小结(Unicode、utf-8、gbk、gb2312等)
python3 解释器默认编码为Unicode,由str类型进行表示.二进制数据使用byte类型表示. 字符串通过编码转换成字节串,字节码通过解码成为字符串. encode:str-->byte ...
- [2015.02.02]文本编码转换专家 v2.6
软件名称:文本编码转换专家最新版本:v2.6操作系统:XP/2003/Win7/Win2008软件介绍:文本编码转换专家,界面简洁易用,功能强大实用.自动识别文件编码,有效转换成目标编码.真正的多线程 ...
- node.js整理 03文件操作-遍历目录和文本编码
遍历目录 递归算法 遍历目录时一般使用递归算法,否则就难以编写出简洁的代码. 递归算法与数学归纳法类似,通过不断缩小问题的规模来解决问题 function factorial(n) { if (n = ...
- mac 文本编辑器 文本编码Unicode utf-8 不适用的问题
在mac上使用默认的文本编辑器打开下载的xx.txt文件,如果文本是gbk的编码可能会出现 文本编码Unicode utf-8 不适用的打开错误,如下图 解决方式: 文本编辑---偏好设置-----打 ...
- Mac下用命令行直接批量转换文本编码到UTF8
由于近期在Mac下写Android程序,下载的一些Demo由于编码问题源码里的汉字出现乱码,文件比较多,所以想批量解决下文件的编码问题. Mac下有以下两种方式可以解决: A. 文件名的编码:Mac的 ...
- python3中的编码与解码(超好理解)
编码和解码是针对数据而言的,数据能干什么呢?无非就是用来显示,储存和传输的: 储存和传输数据当然是希望数据越小越好,所以发明了utf-8这种数据编码显示:它智能将英文用一个字节表示,欧洲的字符用两个字 ...
- 011_如何decode url及图片转为base64文本编码总结
一.咱们经常会遇到浏览器给encode后的url,如何转换成咱们都能识别的url呢?很简单,talk is easy,Please show me your code,如下所示: (1)英文decod ...
随机推荐
- 【2015 Week Task】
2015 第17周 task:项目语音识别技术整理 2015 第18周 task:项目key技术整理
- Tomcat中部署web应用的三种方式
Tomcat中部署web应用的三种方式(静态部署) 第一种,针对war或解压后的war,最为常用的是直接操作webapp目录,将完整的war包或者web应用直接放到webapp目录下.使用 ...
- blog test
try my first blog by cnblog. i will record my learn experence in the future.
- C# Process.WaitForExit()与死锁
前段时间遇到一个问题,搞得焦头烂额,现在记录下来,希望对大家有所帮助. 程序里我使用Process类启动命令行,执行批处理文件 'Create.cmd'(当我手工将此文件拖入命令行执行时,一切正常). ...
- python入门10 循环语句
两种循环: 1 for in 2 while #coding:utf-8 #/usr/bin/python """ 2018-11-03 dinghanhua 循环语句 ...
- CRUD全栈式编程架构之数据层的设计
CodeFirst 一直以来我们写应用的时候首先都是创建数据库 终于在orm支持codefirst之后,我们可以先建模. 通过模型去创建数据库,并且基于codefirst可以实现方便的 实现数据库迁移 ...
- mysql数据库 BETWEEN 语法的用法和边界值解析
between用法: 用于where表达式中,选取两个值之间的数据,如: SELECT id FROM user WHERE id BETWEEN value1 AND value2; 当betwee ...
- c++基础知识_c++11 类默认函数的控制:"=default" 和 "=delete"函数
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #include <vecto ...
- Android(java)学习笔记42:Map集合的获取功能
1. Map集合的获取功能: package cn.itcast_01; import java.util.Collection; import java.util.HashMap; import ...
- 在Hibernate单向一对多关联关系中的org.hibernate.StaleStateException 异常。
具体异常如下: Caused by: org.hibernate.StaleStateException: Batch update returned unexpected row count fro ...