Python 编码(一)— Python3

Unicode

什么是 Unicode

标准 unicode

标准 Unicode 为每个字符提供了一个独特的数字,并且跨平台、设备、应用或者编程语言都是通用的。 -- 来自 http://unicode.org/standard/WhatIsUnicode.html

Unicode

什么是 Unicode

标准 unicode

标准 Unicode 为每个字符提供了一个独特的数字,并且跨平台、设备、应用或者编程语言都是通用的。 -- 来自 http://unicode.org/standard/WhatIsUnicode.html

Unicode 之前的编码

比如 ASCII、GBK等等。

这些早期的字符编码是受限制的并且不能包含包含全世界语言的编码。

早期的字符编码互相之间也会冲突。两种编码可能使用同样的数字来表示不同的字符或者使用不同的数字来表示同样的字符。任意给定的计算机(尤其是服务器)会需要支持多种不同的编码。然而当数据在不同计算机或不同编码之间传递的时候,数据会有冲突的风险。 -- 来自 https://zh.wikipedia.org/wiki/Unicode#%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F

UTF

UTF(Unicode Transformation Format) 的意思是 Unicode 转换格式。

例如,如果一个仅包含基本7位ASCII字符的Unicode文件,如果每个字符都使用2字节的原Unicode编码传输,其第一字节的8位始终为0。这就造成了比较大的浪费。对于这种情况,可以使用UTF-8编码,这是一种变长编码,它将基本7位ASCII字符仍用7位编码表示,占用一个字节(首位补0)。而遇到与其他Unicode字符混合的情况,将按一定算法转换,每个字符使用1-3个字节编码,并利用首位为0或1进行识别。这样对以7位ASCII字符为主的西文文档就大幅节省了编码长度(具体方案参见UTF-8)。类似的,对未来会出现的需要4个字节的辅助平面字符和其他UCS-4扩充字符,2字节编码的UTF-16也需要通过一定的算法进行转换。 -- 来自 https://zh.wikipedia.org/wiki/Unicode#%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F

Python 编码

Unicode 是一连串的数字。

Python 编码指将 Unicode 转换为 bytes。 -- 来自 https://docs.python.org/3/howto/unicode.html#encodings

对于 ASCII 编码:

  1. 如果编码点小于 128,每个比特与编码点的值相同
  2. 如果编码点大于等于 128,那么这些 Unicode 字符不能使用这种编码表示。(Python 会抛出 UnicodeEncodeError)
    -- 来自 https://zh.wikipedia.org/wiki/Unicode#%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F

UTF-8 是最常用的编码,有如下方便的性质:

  1. 可以处理所有 Unicode 编码点。
  2. ASCII 文本也是有效的 UTF-8 文本。
  3. UTF-8 很紧凑;常用的字符可以使用一个或者两个 bytes 表示。
    -- 来自 https://zh.wikipedia.org/wiki/Unicode#%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F

Python3 对 Unicode 的支持

从 Python 3.0 开始,使用 Unicode 储存字符串。

Python 源码的默认编码是 UTF-8,也可以通过 # -*- coding: <encoding name> -*- 来指定特殊的编码。

读写 Unicode 数据

Unicode 数据在写入磁盘或者发送到一个 socket 前通常会被转化为一种编码。你可以自己完成所有的工作:打开一个文件,从文件中读取 8-bit bytes 然后使用 bytes.decode(encoding) 转换 bytes。但是不推荐手动处理。

一个原因是一个 Unicode 字符可以被多个 bytes 表示。如果你读取任意大小的块(比如 1024 或者 4096 bytes),你需要写错误处理代码来捕捉块的末尾部分 Unicode 字符不完整的情况。一个解决办法是读取整个文件到内存中,但是这会使你不能处理大文件。

解决办法是使用低级别的解码接口来捕捉部分编码序列的情况。这个工作已经被自带的 open() 函数实现了,open(filename, encoding=encoding) 返回一个可以拥有如 read()write() 等方法的 file-like 对象。
-- 以上引用来自 https://docs.python.org/3/howto/unicode.html#reading-and-writing-unicode-data

Unicode 在编程中的技巧

软件内部应该只使用 Unicode 字符串,尽快解码输入数据(bytes)并只在最后给输出编码。

当使用来自浏览器或者其他不信任来源的数据时,一个常用的技巧是在使用字符串作为命令行或者储存字符串到数据库前检查字符串中的非法字符。如果你打算这样做,要注意检查解码后的字符串,而不是编码的 bytes 数据;因为一些编码可能有一些有趣的属性,比如有多个意思或者不是完全适配 ASCII。 -- 来自 https://docs.python.org/3/howto/unicode.html#tips-for-writing-unicode-aware-programs

未知编码的文件

如果你知道文件的编码是适配 ASCII 的并且只想测试或修改 ASCII 的部分,你可以用 surrogateescape 错误处理器来打开文件。

with open(fname, 'r', encoding="ascii", errors="surrogateescape") as f:
    data = f.read()

# make changes to the string 'data'

with open(fname + '.new', 'w',
          encoding="ascii", errors="surrogateescape") as f:
    f.write(data)

surrogateescape 错误处理器将所有非 ASCII bytes 解码为 Unicode 编码点。这些秘密编码点会变回同样的 bytes 当使用 surrogateescape 编码数据并写出的时候。
-- 来自 https://docs.python.org/3/howto/unicode.html#files-in-an-unknown-encoding

假设文件只有一种编码,那么可以尝试使用 所有标准编码 进行解码,从解码没有报错的结果中挑选出合适的,即没有乱码的结果。
Unicode 之前的编码

比如 ASCII、GBK等等。

这些早期的字符编码是受限制的并且不能包含包含全世界语言的编码。

早期的字符编码互相之间也会冲突。两种编码可能使用同样的数字来表示不同的字符或者使用不同的数字来表示同样的字符。任意给定的计算机(尤其是服务器)会需要支持多种不同的编码。然而当数据在不同计算机或不同编码之间传递的时候,数据会有冲突的风险。 -- 来自 https://zh.wikipedia.org/wiki/Unicode#%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F

UTF

UTF(Unicode Transformation Format) 的意思是 Unicode 转换格式。

例如,如果一个仅包含基本7位ASCII字符的Unicode文件,如果每个字符都使用2字节的原Unicode编码传输,其第一字节的8位始终为0。这就造成了比较大的浪费。对于这种情况,可以使用UTF-8编码,这是一种变长编码,它将基本7位ASCII字符仍用7位编码表示,占用一个字节(首位补0)。而遇到与其他Unicode字符混合的情况,将按一定算法转换,每个字符使用1-3个字节编码,并利用首位为0或1进行识别。这样对以7位ASCII字符为主的西文文档就大幅节省了编码长度(具体方案参见UTF-8)。类似的,对未来会出现的需要4个字节的辅助平面字符和其他UCS-4扩充字符,2字节编码的UTF-16也需要通过一定的算法进行转换。 -- 来自 https://zh.wikipedia.org/wiki/Unicode#%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F

Python 编码

Unicode 是一连串的数字。

Python 编码指将 Unicode 转换为 bytes。 -- 来自 https://docs.python.org/3/howto/unicode.html#encodings

对于 ASCII 编码:

  1. 如果编码点小于 128,每个比特与编码点的值相同
  2. 如果编码点大于等于 128,那么这些 Unicode 字符不能使用这种编码表示。(Python 会抛出 UnicodeEncodeError)
    -- 来自 https://zh.wikipedia.org/wiki/Unicode#%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F

UTF-8 是最常用的编码,有如下方便的性质:

  1. 可以处理所有 Unicode 编码点。
  2. ASCII 文本也是有效的 UTF-8 文本。
    UTF-8 很紧凑;常用的字符可以使用一个或者两个 bytes 表示。
    -- 来自 https://zh.wikipedia.org/wiki/Unicode#%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F

Python3 对 Unicode 的支持

从 Python 3.0 开始,使用 Unicode 储存字符串。

Python 源码的默认编码是 UTF-8,也可以通过 # -*- coding: <encoding name> -*- 来指定特殊的编码。

读写 Unicode 数据

Unicode 数据在写入磁盘或者发送到一个 socket 前通常会被转化为一种编码。你可以自己完成所有的工作:打开一个文件,从文件中读取 8-bit bytes 然后使用 bytes.decode(encoding) 转换 bytes。但是不推荐手动处理。

一个原因是一个 Unicode 字符可以被多个 bytes 表示。如果你读取任意大小的块(比如 1024 或者 4096 bytes),你需要写错误处理代码来捕捉块的末尾 Unicode 字符不完整的情况。一个解决办法是读取整个文件到内存中,但是这会让你不能处理大文件。

解决办法是使用低级别的解码接口来捕捉部分编码序列的情况。这个工作已经被自带的 open() 函数实现了,open(filename, encoding=encoding) 返回一个可以拥有如 read()write() 等方法的 file-like 对象。
-- 以上引用来自 https://docs.python.org/3/howto/unicode.html#reading-and-writing-unicode-data

编写注意 Unicode 的程序的技巧

软件内部应该只使用 Unicode 字符串,尽快解码输入数据(bytes)并只在最后给输出编码。

当使用来自浏览器或者其他不信任来源的数据时,一个常用的技巧是在使用字符串作为命令行或者储存字符串到数据库前检查字符串中的非法字符。如果你打算这样做,要注意检查解码后的字符串,而不是编码的 bytes 数据;因为一些编码可能有一些有趣的属性,比如有多个意思或者不是完全适配 ASCII。 -- 来自 https://docs.python.org/3/howto/unicode.html#tips-for-writing-unicode-aware-programs

未知编码的文件

如果你知道文件的编码是适配 ASCII 的并且只想测试或修改 ASCII 的部分,你可以用 surrogateescape 错误处理器来打开文件。

with open(fname, 'r', encoding="ascii", errors="surrogateescape") as f:
    data = f.read()

# make changes to the string 'data'

with open(fname + '.new', 'w',
          encoding="ascii", errors="surrogateescape") as f:
    f.write(data)

surrogateescape 错误处理器将所有非 ASCII bytes 解码为 Unicode 编码点。这些秘密编码点会变回同样的 bytes 当使用 surrogateescape 编码数据并写出的时候。
-- 来自 https://docs.python.org/3/howto/unicode.html#files-in-an-unknown-encoding

假设文件只有一种编码,那么可以尝试使用 所有标准编码 进行解码,从解码没有报错的结果中挑选出合适的。合适的结果指没有乱码的结果。

原文地址:https://www.cnblogs.com/jay54520/p/8353206.html

时间: 2024-07-30 23:21:04

Python 编码(一)— Python3的相关文章

python编码问题——解决python3 UnicodeEncodeError: &#39;gbk&#39; codec can&#39;t encode character &#39;\xXX&#39; in position XX

python实现爬虫遇到编码问题: error:UnicodeEncodeError: 'gbk' codec can't encode character '\xXX' in position XX 解决办法:改变标准输出 添加代码: sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030') #改变标准输出的默认编码 ps: 1.str转bytes叫encode,bytes转str叫decode 2.常用的中文编码名

Python 编码

Python 编码 ASCII.Unicode.UTF-8 以及 gbk 在具体说明 Python 编码之前,先来理清 ASCII.Unicode.UTF-8.gbk 究竟是什么? 这边仅简单介绍下,具体请百度. ASCII:是现今最通用的单字节编码系统.ASCII(仅1~127) 仅可代表英文.数字及一些符号等,如,A 的 ASCII 码为65(十进制). Unicode:为了解决传统的字符编码方案的局限而产生,为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言.跨平台进行文本

说说Python编码规范

前言 已有近两个月没有发表过文章了,前段时间外甥和女儿过来这边渡暑假,平常晚上和周末时间都陪着她们了,趁这个周末有空,再抽空再把这块拾起来.         这么久没写了,再次拿起键盘,想想,发表些什么呢,想起上次公司的代码评审委员会下周其中一个议题是关于Python编码规范的整理,那就趁热打铁,整理一份关于Python编码规范的文章,也为那些写Python的人,提供一些编码注意的一些事项或者说是参考吧. 编码规范的作用         规范故明思义,就是通过不断的总结,吸取好的点,从而形成的一

Python Solve UnicodeEncodeError &#39;gbk&#39; / &#39;ascii&#39; / &#39;utf8&#39; codec can&#39;t encode character &#39;\x??&#39; in position ? 解决有关Python编码的错误

在Python中,处理中文字符一直是很令人头痛的问题,一言不合就乱码,而且引起乱码的原因也不尽相同,有时候是python本身默认的编码器设置的不对,有时候是使用的IDE的解码器不对,还有的时候是终端terminal的解码器不对,有时候同一份代码在Python2上正常运行,Python3上就不行了,反正产生乱码的原因很多,这里就列举一些博主遇到过的一些错误及其解决方案: Error 1: UnicodeEncodeError: 'gbk' codec can't encode character

【Python进阶】02、python编码问题

一.ASCII.Unicode和UTF-8的区别 因为字符编码的问题而苦恼不已,于是阅读了大量的博客,再进行了一定的测试,基本搞清楚了编码问题的前因后果. 1.字符集和字符编码 计算机中储存的信息都是用二进制数表示的:而我们在屏幕上看到的英文.汉字等字符是二进制数转换之后的结果.通俗的说,按照何种规则将字符存储在计算机中,如'a'用什么表示,称为"编码":反之,将存储在计算机中的二进制数解析显示出来,称为"解码",如同密码学中的加密和解密.在解码过程中,如果使用了错

linux之系统编码,python编码,文件编码

1     前言 如果你对python2和python3的中编解码很清楚,这里我认为你很清楚. 具体参考文档: "python2 encode和decode函数说明.docx" "字符编码--从ASCII开始.docx" 以上所有文档均为本地文档. 2     Python编码 sys.getdefaultencoding(): 获取系统当前编码,这里的系统指的是python自己的内置系统,并非操作系统,即3中的python编码. sys.setdefaultenc

Python之路3【知识点】白话Python编码和文件操作

Python文件头部模板 先说个小知识点:如何在创建文件的时候自动添加文件的头部信息! 通过:file--settings 每次都通过file--setings打开设置页面太麻烦了!可以通过:View--选中Toolbar工具条 修改后的效果: 一.Python Script 模板第一行 这个很简单告诉系统用什么解释去解释,如果你直接用python python_file_name.py的话这个没什么影响可以不加. 但是如果想直接通过./python_file_name.py去运行的话就得加上!

Python编码简要说明

●python2默认编码:ASCII编码 达到正确显示,程序需要编码转换: UTF-8 -- >decode解码 --> Unicode Unicode -- > encode编码 -- > GBK / UTF-8 ●python3默认文件编码:utf-8(解释器编码) python3的内存里:全部是unicode python3执行代码的过程: 1.解释器找到代码文件,把代码字符串按文件头定义的编码加载到内存,转成unicode 2.把代码字符串按照python语法规则进行解释

Python基础知识(三) Python编码、变量、if和while语句

Python入门知识 一.第一句Python代码 在Linux下/home/test目录下创建hello.py文件,内容如下: [[email protected] ~]# mkdir /home/test [[email protected] ~]# cd /home/test [[email protected] test]# cat hello.py print("Hello World!") 执行hello.py文件,得到以下内容: [[email protected] tes