当前位置: 首页 > 编程日记 > 正文

python 字符编码问题

字符编码

一、字符编码的演进

  • ASCII
  • GB2312    GBK1.0    GB18030
  • Unicode编码:国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换。Unicode(统一码、万国码)规定所有的字符和符号最少由16位来表示(2个字节),即:2 ** 16 = 65535
  • UTF-8


二、为什么有bytes?
是因为要表示图片、视频等二进制格式的数据

三、如何在python2实现,写一个软件,在全球各国电脑上,都能正常显示?
答:1、以Unicode编码写你的软件,直接在内存里声明变量的时候以Unicode格式
s = u'路飞' #Unicode
2、转成Unicode,文件编码定义的utf-8,读取到内存里还是utf-8编码,所以需要解码转成Unicode
d2 = d.decode("uft-8")
d2 = d.decode("gbk")

四、python2 和python3的区别
py2:str = bytes,Unicode str类型,Unicode类型
py3:str = Unicode,bytes str类型

文件头声明
py2:以uft-8 or GBK 等编码的代码,代码内容加载到内存,并不会被转成Unicode,编码依然是源编码
py3:以utf-8 or GBK 等编码的代码,代码内容加载到内存,会被自动转成Unicode

python2
以utf-8编码的字符串,在Windows上的默认编码是GBK,读取到内存,python2上不会自动转成Unicode编码,所以不能正常显示


python3
字符串的编码改成了Unicode
str就是Unicode格式的字符串
bytes就是单纯的二进制
文件的默认编码变成了utf-8

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码
用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件


对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符

 

python字符编码演示

一、python2 Windows终端,GBK格式

1、直接在Windows终端输入,定义的变量字符串编码格式应该是GBK

PS C:\Users\martin> python2
Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:25:58) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> d = "路飞"         #定义一个变量,因为是在Windows终端定义的,默认编码是GBK,所以该字符串的编码格式为GBK
>>> d
'\xc2\xb7\xb7\xc9'    #这里可以看出来该变量是GBK格式的,GBK编码,一个中文占用两个字节,一个字节用两个十六进制表示,python2里的字符串和字节是等同的
>>> print d
路飞                   #这里没有乱码,是因为该字符串是GBK编码的的,终端的编码格式也是GBK,所以能正常显示
>>> d2 = d.decode()   #python2 内存里默认的解码的编码是ASCII,这里没指定,常用的ASCII最高位为0,而这个字符串是中文,GBK编码,最高位为1,所以ASCII提示无法解码
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128)
>>> d2 = d.decode("gbk")      #把字符串以GBK编码解码成Unicode
>>> d2
u'\u8def\u98de'               #Unicode类型,python2中str==byte,有单独的Unicode类型
>>> print d2
路飞                          #虽然这里是GBK编码的终端,但因为所有系统都支持Unicode,所以这里能正常显示
>>> d3 = d2.encode("utf-8")  #将d2以utf-8编码,存储和网络传输一般选择utf-8编码
>>> d3
'\xe8\xb7\xaf\xe9\xa3\x9e'   #uft-8编码一个中文占3个字节
>>> print d3
璺                         #uft-8编码格式的d3读取到内存后,utf-8一个中文占三个字节,终端默认是GBK,GBK一个中文占两个字节,所以显示不正常


2、以文件的方式保存,声明编码格式为utf-8,那里面定义的变量字符串是utf-8编码格式,在python2上运行,查看结果

#!/usr/bin/env python
# -*-coding:utf-8-*-
d = "路飞" 
print(type(d))
print(d)

输出:
<type 'str'>       #python2定义的变量为字符串类型,字符串以声明的或默认的编码格式存储字符串
璺               #这里编码格式是utf-8,uft-8一个中文占三个字节,终端默认是GBK,GBK一个中文占两个字节,读取到内存后,GBK无法正确判断对应关系,所以显示不正常d2 = d.decode("utf-8") #这里讲utf-8编码格式解码成Unicode
print(type(d2))
print(d2)

输出:
<type 'unicode'>
路飞                   #虽然这里是GBK编码的终端,但因为所有系统都支持Unicode,所以这里能正常显示d3 = d2.encode("gbk")  #将Unicode编码成GBK格式
print(type(d3))
print(d3)
输出: <type 'str'> 路飞 #因为终端就是GBK编码的,所以能正常显示

二、python3 Windows终端 GBK格式
1、直接Windows终端输入

PS C:\Users\martin> python
Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 17:26:49) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> s = "路飞"            #python3中的字符串是Unicode格式,定义的变量字符串在内存里默认都是Unicode,Unicode编码格式的字符串
>>> type(s)
<class 'str'>
>>> s
'路飞'>>> s2 = s.encode("gbk") #将Unicode以GBK格式编码
>>> type(s2)
<class 'bytes'>
>>> s2
b'\xc2\xb7\xb7\xc9'>>> s3 = s2.decode()        #将GBK格式的编码以默认的编码(uft-8)解码,因为是GBK格式的编码,所以用utf-8解码会报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb7 in position 2: invalid start byte
>>> s3 = s2.decode("gbk")   #将GBK格式的编码以GBK解码
>>> type(s3)
<class 'str'>
>>> s3
'路飞'>>> s4 = s3.encode()        #以utf-8编码
>>> type(s4)
<class 'bytes'>
>>> s4
b'\xe8\xb7\xaf\xe9\xa3\x9e' #一个中文占三个字节>>> s5 = s4.decode()        #以uf-8解码
>>> type(s5)
<class 'str'>
>>> s5
'路飞'


2、以文件的方式保存,声明编码格式为utf-8

 

s = "路飞"               #python3中的字符串是Unicode
print(s)
print(type(s))输出:
路飞
<class 'str'>s2 = s.encode("gbk")    # 一个字节占8bit,8bit = 1byte,\x代表十六进制,两个十六进制占一个byte,把s以GBK格式编码成字节类型
print(s2)
print(type(s2))输出:
b'\xc2\xb7\xb7\xc9'
<class 'bytes'>s3 = s2.decode("gbk")  #把字节类型的s3以GBK格式解码成Unicode格式的字符串
print(s3)
print(type(s4))输出:
路飞
<class 'str'>

转载于:https://www.cnblogs.com/jmaly/p/7999343.html

相关文章:

谢文睿:西瓜书 + 南瓜书 吃瓜系列 6. 神经网络

Datawhale南瓜书是经典机器学习教材《机器学习》&#xff08;西瓜书&#xff09;的公式推导解析指南&#xff0c;旨在让在学习西瓜书的过程中&#xff0c;再也没有难推的公式&#xff0c;学好机器学习。 以往内容&#xff1a; 西瓜书公式推导讲解来了&#xff01;0. 导学1. 一…

Python培训常识:Python面试中常被问到的几种设计模式要知道

学习Python技术大家都是为了日后能够找到适合自己的工作岗位&#xff0c;那么除了要学习好Python技术外&#xff0c;对于面试环节的问题也要有所了解&#xff0c;本期小编为大家介绍的Python培训教程就算关于Python面试中常被问到的几种设计模式&#xff0c;希望能够给带来帮助…

ThinkPHP 框架学习

学习内容全部参考开发手册 建议收藏网页 https://www.kancloud.cn/manual/thinkphp/1696 一、几个概念 应用&#xff1a;基于同一个入口文件访问的项目称之为一个应用 模块&#xff1a;一个应用下面可以包含多个模块。每个模块在应用目录下面都是一个独立的子目录 控制器&…

【青少年编程】【三级】克隆猫游戏

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料&#xff08;视频、代码、文档&…

想转行学软件测试要注意哪些问题

软件测试的快速发展&#xff0c;让很多人都红了眼&#xff0c;大家都想转行学软件测试&#xff0c;那么想转行学软件测试要注意哪些问题呢?大家是否考虑过自己是否合适呢?那么我们来看看下面的介绍吧。 想转行学软件测试要注意哪些问题?据数据显示&#xff0c;今年毕业生首选…

SpringMVC学习二

使用POJO作为参数 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app version"3.0" xmlns"http://java.sun.com/xml/ns/javaee" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocatio…

使用CInternetSession和CHttpFile读取网页内容

参考网址&#xff1a;http://www.398588.com/Article/T9/78.aspx读取网页的内容可以类比本地的文件一下&#xff0c;代码如下&#xff1a;#include <afxinet.h> CString url; GetDlgItemText(IDC_EDIT1,url); CInternetSession Sess; CHttpFile*cFile (CHttp…

谢文睿:西瓜书 + 南瓜书 吃瓜系列 7. 支持向量机

Datawhale南瓜书是经典机器学习教材《机器学习》&#xff08;西瓜书&#xff09;的公式推导解析指南&#xff0c;旨在让在学习西瓜书的过程中&#xff0c;再也没有难推的公式&#xff0c;学好机器学习。 以往内容&#xff1a; 西瓜书公式推导讲解来了&#xff01;0. 导学1. 一…

Python培训分享:Python发展前景怎么样?

最近学习Python技术的同学越来越多&#xff0c;大家对于Python技术比较关注的两个点&#xff0c;就是Python技术好不好学&#xff0c;Python就业前景好不好&#xff0c;那么本文针对Python发展前景怎么样这个问题为大家做下详细的介绍。 Python培训分享&#xff1a;Python发展前…

处理器拦截器(HandlerInterceptor)详解

处理器拦截器&#xff08;HandlerInterceptor&#xff09;详解 编程界的小学生 关注 2017.04.06 15:19* 字数 881 阅读 657评论 0喜欢 4简介SpringWebMVC的处理器拦截器&#xff0c;类似于Servlet开发中的过滤器Filter&#xff0c;用于处理器进行预处理和后处理。 应用场景1、日…

Datawhale组队学习周报(第018周)

文章目录本周结营的开源内容即将结营的开源内容正在进行的开源内容七月排期的开源内容希望排期的开源内容每周号外Whalepaper 招新公告本周&#xff08;06月14日~06月20日&#xff09;&#xff0c;第 25 期组队学习一共有 3 门开源课程&#xff0c;共组建了 3 个学习群&#xf…

【原创】多台电脑如何公用一个键盘鼠标进行操作 - Mouse with Borders 软件

搞程序开发的同事经常会碰到类似的情况&#xff0c;桌子有多台设备&#xff0c;笔记本&#xff0c;台式机了&#xff0c;经常需要来回切换操作&#xff0c;桌子上摆满了键盘和鼠标&#xff0c;如果要是用同一个键盘或者鼠标&#xff0c;操作这些设备那就很便利了。 给大家推荐一…

Python培训教程分享:如何实现pygame的初始化和退出操作?

本期小编为大家介绍的Python培训教程是关于“如何实现pygame的初始化和退出操作?”的内容&#xff0c;pygame模块针对不同的开发需求提供了不同的子模块&#xff0c;例如显示模块、字体模块、混音器模块等&#xff0c;一些子模块在使用之前必须进行初始化&#xff0c;比如字体…

PLSQL的 dynamic sql小例子

开始 SET serveroutput ON;DECLAREp_tab_name varchar2(20);cursor_name INTEGER;p_rows_del INTEGER; BEGINp_tab_name : EMP_CPY;cursor_name : DBMS_SQL.OPEN_CURSOR;DBMS_SQL.PARSE(cursor_name, DELETE FROM ||p_tab_name, DBMS_SQL.NATIVE);DBMS_OUTPUT.PUT_LINE(p_tab_n…

【青少年编程】陈晓光:打靶游戏

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料&#xff08;视频、代码、文档&…

Phpcms V9手机门户设置教程:怎么用PC V9做手机网站

一、在PHPcms V9管理后台设置手机门户 1.1、开启手机网站。位置&#xff1a;模块 》手机门户 》 添加手机站点&#xff0c;具体设置可参照截图&#xff1a; 填写站点名和LOGO文件相对位置&#xff0c;绑定用于手机网站的二级域名m.cmsyou.com&#xff0c;域名以http://开头。 1…

参加软件测试培训需要学习哪些知识

软件测试在互联网行业的发展前景非常好&#xff0c;很多人都想学习软件测试&#xff0c;其中有很多都是零基础学员&#xff0c;那么参加软件测试培训需要学习哪些知识?零基础是否能学会呢?来看看下面的详细介绍吧。 参加软件测试培训需要学习哪些知识?下面给大家简单说下软件…

C#用XmlDocument操作XML

1.加载xml文件 string xmlPath AppDomain.CurrentDomain.BaseDirectory"xml/test.xml"; XmlDocument xmlDoc new XmlDocument(); xmlDoc.Load(xmlPath);//这里是xml文件的路径 string xmlString"<books><book>test</book></books>…

【第20周复盘】转换思路,让更多的小朋友们参与进来!

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料&#xff08;视频、代码、文档&…

篇三:XPath--解析Html

篇三&#xff1a;XPath--解析Html

Python培训教程:什么是Python全局解释器锁(GIL)?

本期Python培训教程小编为大家带来的是关于“什么是Python全局解释器锁(GIL)?”的问题&#xff0c;全局解释器锁是计算机程序设计语言解释器用于同步线程的工具&#xff0c;使得在同一进程内任何时刻仅有一个线程在执行&#xff0c;常见的有CPython、Ruby MRI。 Python培训教程…

Datawhale组队学习周报(第019周)

本周&#xff08;06月21日~06月27日&#xff09;&#xff0c;第 25 期组队学习一共有 3 门开源课程&#xff0c;共组建了 3 个学习群&#xff0c;参与的学习者有 292 人&#xff0c;其中 web开发入门教程、数据挖掘实战&#xff08;异常检测&#xff09; 已经结营&#xff0c;另…

git ingore添加忽略文件无较的解决方法

一、启动Git Bash并切换到项目目录下 二、执行下列语句&#xff1a; git rm -r --cached . git add . git commit -m update .gitignore 三、OK。

01、WPF 中 URI 解析

WebBrowser 控件导航到包中的 html 文件,首先把该文件 (bland.html) 的属性设置为 "Resource"、“始终复制”&#xff0c; 然后在 C# 页面可以导航到该文件。 webView.Navigate(new Uri(System.Environment.CurrentDirectory "/Assets/bland.html", UriK…

现在参加软件测试培训就业难度大不大?

软件测试对于IT行业来说&#xff0c;入门是相对比较简单的&#xff0c;所以学习起来是非常快的&#xff0c;零基础也可以在短时间内学会&#xff0c;那么现在参加软件测试培训就业难度大不大呢?看出来大家主要关心的是就业问题&#xff0c;来看看下面小编的详细介绍就知道了。…

ABP理论学习之数据传输对象(DTO)

本篇目录 为何需要DTO 领域层抽象数据隐藏序列化和懒加载问题DTO惯例和验证 DTO和实体的自动映射 使用特性和扩展方法进行映射帮助接口DTO用于应用层和 展现层间的数据传输。 展现层调用具有DTO参数的应用服务方法&#xff0c;然后应用服务使用领域对象来执行一些特定的业务逻辑…

Linux如何查看当前目录下文件的个数

查看当前目录下文件的个数 ls -l | grep "^-" | wc -l 查看当前目录下文件的个数&#xff0c;包括子目录里的。 ls -lR| grep "^-" | wc -l 查看某目录下文件夹&#xff08;目录&#xff09;的个数&#xff0c;包括子目录里的。 ls -lR| grep "^d&quo…

迟语寒:组队学习的那些事

很开心又拿到了优秀船员&#xff0c;其实这已不是我第一次参加组队学习了&#xff0c;4月份的二手车是我第一次接触到DataWhale&#xff0c;那次课程结束后&#xff0c;马老师找到我让我分享一下心得&#xff0c;但是我觉得第一次坚持下来不算什么&#xff0c;于是我答应他如果…

Python培训教程分享:Python模块如何导入__all__属性?

本期小编为大家带来的Python培训教程是关于“Python模块如何导入__all__属性?”的内容&#xff0c;后面在工作中是会遇到Python模块这个工作内容的&#xff0c;Python模块的开头通常会定义一个__all__属性&#xff0c;该属性实际上是一个元组&#xff0c;该元组中包含的元素决…

F#探险之旅(三):命令式编程(上)

F#系列随笔索引页面 在本系列的第二部分&#xff08;函数式编程上、中、下&#xff09;中&#xff0c;我们了解了如何使用F#进行纯粹的函数式编程。但是在一些情况下&#xff0c;比如I/O&#xff0c;几乎不能避免改变状态&#xff0c;也就是说会带来side effect。F#并不强求你以…