返回顶部
首页 > 资讯 > 后端开发 > Python >Python之string编码问题
  • 842
分享到

Python之string编码问题

Python string编码string编码Python编码 2023-02-28 17:02:51 842人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、前言什么是编码?什么是字符集二、影响python执行的编码方案1.Python解释器的默认编码2.Python源文件文件编码3.操作系统的语言设置4.Terminal使用的编

一、前言

使用过Python的同学们一定被她的各种编码问题缠绕过,因为平常维护的新老项目跨越 2、3两个版本,编码问题有时更是让我苦不堪言,遂下定决心,一定要干掉他,吃透他,遂记录此篇博文以分享记录!

什么是编码?

通常我们所说的编码一般为简称, 其实在平常的应用过程,编码一般包括 编码和解码,如在编码前指定 字符集UTF-8, 那么解码时也必须为UTF-8,否则会出现所谓的 乱码

什么是字符集

字符集类似于中文,英文,是一个规则集合的抽象概念,其规定了某个文字对应的二进制数字存放方式,即为编码过程,或者二进制数字对应的文字,即为解码过程!

字符集包括如下:

1.字库表

  • 字库表是一个相当于所有可读或者可显示字符的数据库,字库表决定了整个字符集能够展现表示的所有字符的范围

2.编码字符集(通常简称 字符集)

  • 编码字符集,用一个编码值code point(二进制代码)来表示一个字符(即该字符在字库表中的位置)

3.字符编码

  • 字符编码,是编码字符集和实际存储数值之间的转换关系;
  • 字符,是根据字符编码方案转换为一个二进制数值存储在计算机中的

一个范例

下面以一个实例解释下编解码的过程

  • 字符编码: UTF-8
  • 字符串:中国
  • Python版本:2.7

说明:

1.编码转换方式

str_unicode为中间码。

即对应编码字符集 在字库表中有唯一id代表一个字符, 理论上 unicode即可以映射表示所有字符,但是为了压缩存储的位数,发展出了 utf-8、utf-16等字符编码,即在实际存储和字符展现之间又建立了一层映射,这层映射表示了 utf-8 到 unicode的方式,然后unicode又根据字库表展现改字符。

unicode有 utf-8及utf-16等多种方式的字符编码方案,GBK字符集 则只有一种字符编码 EUC-CN, 而对于Ascii码来说,本身即是编码字符集又是字符编码,

2.以一次Python代码执行为例, 解释 字库表编码字符集(字符集) 字符编码的关系:

utf-8编码如何规定的?

单字节的字符,字节的第一位设为0,对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相同;

n个字节的字符(n>1),第一个字节的前n位设为1,第n+1位设为0,后面字节的前两位都设为10,这n个字节的其余空位填充该字符unicode码,高位用0补足。

UTF-8编码方式

----------------------
0xxxxxxx
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

utf-8和unicode的关系

  • utf 解释为诶 Unicode TransferFORMat 即 转换Unicode。
  • unicode是一种字符编码,规定了每个字符到数字的映射关系, 这个数字怎么存储它没有规定. 而如何存储? 几个字节表示? 这个是utf8等编码方式来规定的。

有了unicode为什么还需要utf-8呢?

  • 首先 unicode 规定了所有字符的二进制编码,并没有规定如何存储
  • 如果我们以统一4个字节来存储所有unicode的编码字符,那就会在表示一个字节编码的ascii部分严重浪费存储性能
  • 另外因为统一4字节处理,那如果一个文件分片或者是一份缺失文件,那么此时该如何来判断我们从头读取的 4字节是一个完整的字符呢?这就会造成很大的分析复杂度,可以说 无法分析, 这也是 utf-8等编码的优点即utf-8错误编码不会向后扩散
  • 综合考虑 utf-8 是一种unicode 标准的存储方案,改方案规定了如何存储unicode字符,即看上面的utf-8的规定,大白话讲就是 utf-8 可变长编码规定了 字符的起始位置,且极大可能节省存储空间,总而言之很简单就是在无序中找到秩序

二、影响Python执行的编码方案

下列四种影响Python执行的编码方案,具体实例以最后所列案例为准

1.Python解释器的默认编码

获取解释器默认编码,python3对应的默认编码为 utf-8,Python2对应的默认编码为ascii

import sys
print(sys.getdefaultencoding())

Python2设置默认编码方式,Python3解释器默认utf-8所以去除该种设置方式

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

解释器编码有什么用?

  • 当调用 decode() 和 encode() 进行编码转换时候,如果未指定编码格式,会调用解释器默认编码进行编码转换
  • 若未指定编码方式 而有中文出现,此时会有报错产生

2.Python源文件文件编码

python源文件的编码与解码,我们写的python程序从产生到执行的过程如下(以PyCharm为例)

依次为

编辑器 决定源代码的编码格式(编辑器中设置)

pycharm 会根据文件开头的编码声明进行文件格式保存

此种声明保存的文件,是utf-8编码的

# coding: utf-8

此种声明保存的文件,是gbk编码的

# coding: gbk

同时也可以在setting中进行设置

解释器按照Ascii或者声明指定的方式解码源代码, 以下是 官方文档给的解释

Python will default to ASCII as standard encoding if no other encoding hints are given.

※: Python2中会按照编码声明对源代码进行解码,如未指定 编码声明 则会以 Ascii进行解码,此时如果有中文会报错

※:Python3默认以utf-8进行解码

若未指定编码声明, 而源代码中有中文

此时Python2 会以Ascii 来进行源代码的'解码';Python3 会默认以  utf-8 进行源代码的'解码'。    

若源文件编码为utf-8, 而编码声明gbk

这种情况会出错,因为磁盘中保存的格式时 gbk 格式的而却以 utf-8 来进行解码,则会出错。

UnicodeDecodeError: 'gbk' codec can't decode bytes in position 2-3: illegal multibyte sequence

注意1:Python3将源代码读取到内存中的字符串编码为 unicode, 这样的中间码的方式,不会出现乱码, Python2以文件头声明的方式将源代码读取到内存中

注意2:Python2 在日常编程中一定注意 文件编码 和 文件声明要一致,如 文件编码为 utf-8 则此时应该如此声明 # coding: utf-8, 若此时用gbk 做声明,则此时会乱码,一编一解 要成对

结果输出,控制台输出日志文件

解释器如何知道该文件的编码格式?

# coding: utf-8

3.操作系统的语言设置

locale 模块获取 操作系统编码

import locale
print locale.getdefaultencoding()

以open()函数为例

open() 函数会调用 Python操作系统默认编码进行 编解码

# coding: utf-8
import sys; reload(sys); sys.setdefaultencoding('utf-8')

str = '中国'  # utf-8  bytes类型
str_unicode = str.decode()  # unicode

with open('demo.txt', 'w') as f:
	f.write(str)  # 写入bytes类型,则此时文件编码为 utf-8 
	f.write(str_unicode)  # 写入 unicode,则此时会根据 sys.getdefaultencoding() 来进行文件编码

linux 下 vim打开以 gbk方式写入的文件会出现乱码,因为此时会调用操作系统的编码方式进行解码

4.Terminal使用的编码

终端编码 继承自操作系统的编码

三、 Python中的编码表示范例

1.utf-8表示中文你好

print("你好".encode('utf-8'))
>>> b'\xe4\xbd\xa0\xe5\xa5\xbd'

很容易看出 其中的 16进制数 e4bda0e5a5bd

2.Python中的len表示什么

  • 对于字节流(bytes: 如utf-8字节流)来说表示字节数
  • 对于unicode则表示字符数

三、最后

使用范例

Pycharm编码设置

  • 字符串变量级别编码
  • 脚本级别的编码
  • py文件级别的编码
  • 显示窗口的编码

问题收集 python3 unicode字符转中文

a = "\\u4ea7\\u54c1\\u72b6\\u6001"

# 两种方式
print(eval(f'u"{a}"'))	
print(a.encode().decode("unicode_escape"))

即 一个字符可以是一个中文汉字、一个英文字母、一个阿拉伯数字、一个标点符号等 ↩︎

如:Unicode、ASCII

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Python之string编码问题

本文链接: https://lsjlt.com/news/197895.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python之string编码问题
    目录一、前言什么是编码?什么是字符集二、影响Python执行的编码方案1.Python解释器的默认编码2.Python源文件文件编码3.操作系统的语言设置4.Terminal使用的编...
    99+
    2023-02-28
    Python string编码 string编码 Python编码
  • Python之string编码问题怎么解决
    这篇文章主要介绍“Python之string编码问题怎么解决”,在日常操作中,相信很多人在Python之string编码问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python之string编码...
    99+
    2023-07-05
  • python编码问题
    基本常识ASCII编码是1个字节bytes,而Unicode编码通常是2个字节1bytes=8bit在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。 字母"A"用ASCII编码是十进...
    99+
    2023-01-31
    python
  • nodejs之base64编码解码问题
    目录nodejs base64 编码解码普通字符串编码解码并转成hex编码解码图片nodejs 操作base64总结nodejs base64 编码解码 普通字符串 编码 var b...
    99+
    2023-02-08
    nodejs base64 base64编码解码 nodejs base64 编码解码
  • python编码问题汇总
    目录一、了解字符编码的知识储备1. 文本编辑器存取文件的原理(nodepad++,pycharm,word)2. python解释器执行py文件的原理 二、字符编码简介三、...
    99+
    2024-04-02
  • Python中的编码问题
    视频汇总首页:http://edu.51cto.com/lecturer/index/user_id-4626073.html对于Python的初学者来说,编码问题相当令人头疼。本文就根据我在学习过程中遇到的问题简单谈一下Python中的编...
    99+
    2023-01-31
    Python
  • python 编码问题 utf8 ?Un
    用python,之前运行的很好,但是UnicodeDecodeError: 'utf8' codec can't decode byte 0xc4 in position 4: invalid continuation byte添...
    99+
    2023-01-31
    python
  • Python中文编码问题
        近日用Python写一个小程序,从数据库(MS SQL)中读取数据,对数据进行组织后发送到邮箱,在数据内容有中文的地方始终报错,汉字使用UTF-8进行编码倒是不报错了,但发送到邮箱的内容,从数据库中读取出来的汉字却成乱码了,经多方查...
    99+
    2023-01-31
    中文 Python
  • 详解python中文编码问题
    目录 1.        在Python中使用中文1.1     Windows控制台1.2     Wi...
    99+
    2022-06-02
    python中文编码 python 编码
  • Python 3.x中的编码和解码问题
    最近在极客学院学习爬虫,老师用的是2.x版本,而我电脑里的版本是3.x,于是在网页上查找在输出中文时如何正确输出。 我原以为2.x 3.x在很多语法上没什么区别,在解码decode上应该也差不多,没想到竟然发现,很多博客提到2....
    99+
    2023-01-31
    Python
  • python中文编码乱码问题的解决
    目录前言:一、什么是字符编码。1.ASCII2.GB23123.Unicode4.UTF-8二、Python2中的字符编码三、decode()与encode()方法四、一个字符编码的...
    99+
    2024-04-02
  • 如何用Python理清编码问题
    今天就跟大家聊聊有关如何用Python理清编码问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。万国码为解决语言各自为政的编码,人们提出了Unicode编码方案,这个方案简单粗暴:把...
    99+
    2023-06-15
  • nodejs爬虫抓取数据之编码问题
    cheerio DOM化并解析的时候 1.假如使用了 .text()方法,则一般不会有html实体编码的问题出现 2.如果使用了 .html()方法,则很多情况下(多数是非英文的时候)都会出现,这时,可能就...
    99+
    2022-06-04
    爬虫 数据 nodejs
  • Java编程之继承问题代码示例
    课堂练习:–在包bzu.aa中定义一个交通工具类(Vehicle):属性——载客量(capacity)方法(1)无参构造方法(给capacity初始化值为2,并输出“执行交通工具类的无参构造方法。”)(2)有参构造方法(传参给capacit...
    99+
    2023-05-30
    java 继承代码 ava
  • linux之系统编码,python编码,
    如果你对python2和python3的中编解码很清楚,这里我认为你很清楚。具体参考文档:“python2 encode和decode函数说明.docx”“字符编码——从ASCII开始.docx”以上所有文档均为本地文档。sys.getde...
    99+
    2023-01-31
    系统 linux python
  • Python3的编码问题
    ​介绍Python3中的编码问题前,第一个段落对字节、ASCII​与Unicode与UTF-8等进行基本介绍,如果不对这几种编码犯头晕,可直接跳过。 ASCII​与Unicode与UTF-8与GBK 首先从老大哥说起。跟很多人一样,...
    99+
    2023-01-31
  • python如何解决中文编码乱码问题
    小编给大家分享一下python如何解决中文编码乱码问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、什么是字符编码。要彻底解决字符编码的问题就不能不去了解到底...
    99+
    2023-06-25
  • Python有关UnicodeUTF-8GBK编码问题详解
    目录1.统一码(Unicode)2.UTF-8编码总结1.统一码(Unicode) Unicode也叫万国码、单一码,是计算机科学领域里的一项业界标准,包括字符集、编码方案等。对于世...
    99+
    2024-04-02
  • python中的编码和解码及\x和\u问题
    目录编码和解码及\x和\u问题python解析 \x 和 \u "乱码"python2.7解析方法python3解析方法编码和解码及\x和\u问题 “...
    99+
    2024-04-02
  • Python之再说编码
    ''' 编码回顾 :     ASCII : 一个字节,包括数字,字母,特殊字符;     GBK : 国标码,占用两个字节,包括中文,部分日文,韩文等;     UNICODE : 万国码, 四个字节,包含世界上所有国家的字符;     ...
    99+
    2023-01-31
    Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作