Unicode

什么是 Unicode

标准 unicode

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

Unicode 之前的编码

比如 ASCII、GBK等等。

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

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

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#实现方式

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#实现方式

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

  1. 可以处理所有 Unicode 编码点。
  2. ASCII 文本也是有效的 UTF-8 文本。
  3. UTF-8 很紧凑;常用的字符可以使用一个或者两个 bytes 表示。

    -- 来自 https://zh.wikipedia.org/wiki/Unicode#实现方式

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

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

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

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

    Python文件头部模板 先说个小知识点:如何在创建文件的时候自动添加文件的头部信息! 通过:file--settings 每次都通过file--setings打开设置页面太麻烦了!可以通过:View ...

  2. python 编码 UnicodeDecodeError

    将一个py脚本从Centos转到win运行,出错如下: UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 0: il ...

  3. python 编码转换(转)

    主要介绍了python的编码机制,unicode, utf-8, utf-16, GBK, GB2312,ISO-8859-1 等编码之间的转换. 常见的编码转换分为以下几种情况: 自动识别 字符串编 ...

  4. python编码详解--转自(Alex的博客)

    原文地址:http://www.cnblogs.com/alex3714/articles/7550940.html 编码回顾 在备编码相关的课件时,在知乎上看到一段关于Python编码的回答 这哥们 ...

  5. 【Python学习】Python3 环境搭建

    参考地址:http://www.runoob.com/python3/python3-install.html Python3 环境搭建 本章节我们将向大家介绍如何在本地搭建 Python3 开发环境 ...

  6. 说说Python编码规范

    前言 已有近两个月没有发表过文章了,前段时间外甥和女儿过来这边渡暑假,平常晚上和周末时间都陪着她们了,趁这个周末有空,再抽空再把这块拾起来.         这么久没写了,再次拿起键盘,想想,发表些什 ...

  7. 转--python 编码规范

    编程规范 1.1. 命名规范 1.1.1. [强制] 命名不能以下划线或美元符号开始和结尾 反例: name / __name / $Object / name / name$ / Object$ 1 ...

  8. Python编码简要说明

    ●python2默认编码:ASCII编码 达到正确显示,程序需要编码转换: UTF-8 -- >decode解码 --> Unicode Unicode -- > encode编码 ...

  9. Python 编码规范(Google)

    Python 编码规范(Google) https://blog.csdn.net/q469587851/article/details/54096093 Python 风格规范(Google) 本项 ...

随机推荐

  1. SSH 基于ajax实现修改密码功能步骤梳理

    1. 为密码输入框进行输入校验,使用easyUI提供的easyui-validatebox <table cellpadding=3> <tr> <td>新密码:& ...

  2. NodeJS 安装cnpm命令行工具错误问题解决

    考虑问题从两个方面: 1.网速(网络太慢也是安装失败的一个原因) 2.系统用户权限(需要系统最开始使用的用管理员,新增的管理员安装会有问题) 报错问题记录于此: 实际上问题是:Windows_NT 6 ...

  3. 各种broker对比

    broker的主要职责是接受发布者发布的所有消息,并将其过滤后分发给不同的消息订阅者.如今有很多的broker,下面就是一张关于各种broker对比的图片: 在使用mosquitto时,如果想使用集群 ...

  4. Hive substr 函数截取字符串

    开发中,经常进行模糊查询或者进行截取字符串进行模糊匹配,常用的就是substr函数或者substring函数. 使用语法: substr(string A, int start),substring( ...

  5. nyoj 1129 Salvation

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=1129 题目分析:感觉题目说的不是多么的清晰,看了别人的分析觉得,也就是说在一个方向不能拐 ...

  6. windows程序 UAC设置,程序运行提示使用管理员权限运行的方法

    在近期的任务中需要对光盘中的程序运行时获取管理员权限运行程序.这个功能的实现需要改变工程的配置. 在vs2015中,使用鼠标右击解决方案管理器中的工程->属性->链接器->清单文件. ...

  7. codeforces #364a Cards

    cf的a题没什么好说到,100的量级,每个人给2张牌,使每个人手中的牌点数相等.保证有一种分配方案. 对每个人,先计算出手中的牌的点数,然后循环两遍拿牌就可以.   A. Cards time lim ...

  8. SQL数据库查询练习题

    一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...

  9. 解决PHP编译cURL的reinstall the libcurl问题

    今天正好要用到PHP的curl功能,发现服务器上的PHP并没有配置curl,进而查询PHP官方文档,得知编译PHP时需要带上 –with-curl参数,才能把curl模块编译进去.我现在PHP已经编译 ...

  10. 关于fork()父子进程返回值的问题

    我们都知道,父进程fork()之后返回值为子进程的pid号,而子进程fork()之后的返回值为0.那么,现在就有一个问题了,子进程fork()的返回值是怎么来的?如果子进程又执行了一遍fork()函数 ...