py2的编码其实是最最贴近实际的编码形式了。反倒是py3,如果遇到个编码标记错误之类的问题,直接让你自杀……

先说编码是什么:我们知道计算机里存储任何数据都是存储的二进制,但是一串文字若是当图片那样存储太浪费空间不说,也会难以解析,所以ascii标准码使用了7位二进制标记了128个字符和控制符号。当然7位不利于数据对齐,所以干脆以8位存储,最高位补个0就好,正好一个字节,此即为基础ascii编码。

但是这128个字符里,虽然包含了常见英文符号和必须的控制符号(比如换行、回车、EOLN、EOF),却对使用其它语言的用户而言没法用,毕竟各家字符不同哇……

首先是欧系拉丁语系指出,既然一个字节一个字符,只用到7位,那么还有128个编号可以用,于是规定了相应的拉丁语系主要符号,同样单字节表示,这样就用到了多出来的一位,这套编码称之为latin-1

再往后,大多数其他拼音语言的国家表示,我们不用拉丁文符号,那么把那128个额外字符改成别的符号,映射自己的文字就没问题了。于是出现了多编码页,也就是最初的codepage。

但是中日韩为首的字形语言系的国家不行啊,你们丫的就几十个符号,可中文之类光常用字就好几千啊……于是针对中文出现了codepage936/gb2312,通过两个字节表示一个汉字,其中包含数千常用字,并且规定最高位为0的部分完全兼容ascii,但是若最高位为1,则必须是两个字节连续出现,用以表示一个汉字——随后还出现了GBK,规定的字符更多,兼容gb2312,同样是个双字节纪录。

然而有两件事情形成了阻碍:一是中文博大精深,汉字实在太多,算上生僻字,两个字节其实也不够用;另一方面,在GB系编码下,所有双字节字符都会被解释成汉字,因此最多做到英汉混排,多语言没戏,同时还会影响到诸如网络传输等等场景,因为同样的双字节二进制数据,对应GBK中文与对应的日文韩文显然不同,这就必须带着编码类型跑,稍不注意就不知道是个啥语言的玩意。

于是出现了unicode,是ANSI标准下的多国语言文字编码。unicode使用32位二进制表示每一个字符,且任意语言任意符号都有独立编码,这样就可以做到使用一套编码同时处理多种不同语言。

unicode是个编码方式,只涉及编号,并不管传输和存储。针对需求,unicode产生了若干传输用编码,其中比较普及的有utf32,utf16和utf8。utf32是每字符32位固定编码,完整映射unicode原编码而不做改变(当然,规定了一下传输时的端序问题);utf16则是最少16位最多32位,属于变长unicode传输方案,以实现对部分codepage的兼容;而utf-8则是最小8位最大32位的编码,变长,且英文部分完全兼容ascii。由于省空间及ascii兼容这两点,使得改用utf8代价最小,才成为了主流。

python2里,与编码有关的有三个部分:

一是源代码识别问题。原本python解释器纯粹把源码使用ascii编码进行解析生成语法树。考虑到源码里可能存在其他语言的字符串量,提供了setdefaultencode接口,但是非常容易引发各类问题。PEP263指出在文件第一行或者第二行(仅限第一行为Unix脚本标注的情况下)写入特殊格式的注释# coding:xxx可以指定解释器解释源码时使用的字符编码。

第二部分则是内置类型转换:python2里的str类,其实是个不存储编码信息的类型。也就是说它把内容二进制按照逐个字节来处理和比对、运算。str类型的「字符串」如果拿来迭代一下,会直接拆成一个个字节来处理。但是,一旦我们需要对非单字节编码的单个字进行处理的时候,python只提供了一个类型来解决问题,即unicode类(注意,实质上py里这个类是utf8进行内存存储的,并不是utf32/unicode原编码),所以常常需要相互转换,将用到encode/decode两个方法。原则上是,decode方法是将一个str按照指定编码解析后转换为unicode,encode方法则是把一个unicode对象用指定编码表示并存储到一个str对象里。

第三点是输入输出。Python2的print的实质是将str里的东西输出到PIPE,如果你print的是一个unicode对象,它会自动根据LOCALE环境变量进行encode之后变成str再输出。然而一般在Windows上都没有设置locale环境变量,py2就按照默认的ascii编码进行处理,于是对中文自然就编码错误了。解决方法是手动encode成对应的输出端可接受的编码后输出。win下一般都是gbk,linux下一般都是utf8

py3中的str则是unicode,bytes才类似于原str,默认代码解析用utf8,默认输出编码也是utf8。

python生僻字如何转码_关于Python下的编码问题?相关推荐

  1. python生僻字如何转码_装13失败后,我决定使用Python为生僻字批量注音

    装13的冷场 "龙生九子,各不相同-" 囚牛.睚眦.嘲风.蒲牢.狻猊.霸下.狴犴.负屃.螭吻. 都说提笔忘字丢人,可至少还有提笔的机会.随着信息化时代的普及,原来越多的人成了半文盲 ...

  2. python生僻字如何转码_如何用Python检测生僻字

    最近在工作中碰到一个需求,要求检测字段是否包含生僻字以及一些非法字符如 ~!@#$%^&*.通过网上的查找资料解决了,现在将解决的过程和示例代码分享给大家,有需要的可以参考借鉴.下面来一起看看 ...

  3. python生僻字如何转码_Python检测生僻字的实现方法

    import re pattern = re.compile('[abc]') match_result = pattern.match('fabc') if match_result: print ...

  4. python版植物大战僵尸源码_基于python的植物大战僵尸游戏设计与实现.docx

    湖南理工学院毕业设计(论文) PAGE PAGE 1 学 号 毕业设计(论文) 题目:基于python的植物大战僵尸游戏设计与实现 作 者 届 别 届 院 别 信息与通信工程学院 专 业 信息工程 指 ...

  5. python中文转到ascii码_解决Python2中文ascii编码的方法

    在YiiChina签到的时候,经常会看到有人在说说里面发群主是最帅的,yii 是 PHP 最好的框架,没有之一,就想到使用一言,在每天签到的时候也发一句话 同时使用方糖将内容推送到微信,防止有什么不对 ...

  6. python识别火车票二维码_使用python脚本实现查询火车票工具

    使用python脚本实现查询火车票信息的效果图如下: 实现的代码: # coding: utf-8 """命令行火车票查看器 Usage: tickets [-gdtkz ...

  7. python发朋友圈源码_用Python发一个高逼格的朋友圈【附代码】

    今天二胖要给大家介绍一个Python库: PIL(Python Image Library) 下面我们用一个实际的例子 看看50行python代码可以做什么神奇的事情 这是二胖发的一个朋友圈 切图前是 ...

  8. python版植物大战僵尸源码_用Python写一个植物大战僵尸! 简直一模一样!

    引入需要的模块 import pygame import random 配置图片地址 IMAGE_PATH = 'imgs/' 设置页面宽高 scrrr_width = 800 scrrr_heigh ...

  9. 生僻字_tte_linux_ttf_提取字体_打印生僻字_uni

    最近遇到个问题,客户有个tte文件,是现场的一个生僻字库,tte文件装不上linux系统,然后客户给的示例excel也莫名其妙的没法在我的电脑显示,我也没法测试服务器到底能不能正常显示. tte文件L ...

最新文章

  1. Nested Mappings
  2. 原生js给div添加类
  3. a5松下驱动器参数设置表_松下伺服几个参数需要熟悉并掌握设置方法
  4. linux之vim操作快速跳到下一个空格和上一个空格命令
  5. python sqlite并发处理_python sqlite大数据 处理
  6. css图片自适应 有缝隙,有间隙,解决办法
  7. scara机器人本体介绍
  8. 基于机器视觉的玻璃Mark点字符识别
  9. 面试再问 HashMap,求你把这篇文章发给他!
  10. linux内核溢出利用,Linux内核堆缓冲区溢出漏洞
  11. 【概率密度函数估计】--- 最大似然估计与Parzen窗函数画法
  12. mysql日期查询索引_mysql – 如何为这种查询索引两个日期列
  13. 【架构师面试-JVM原理-3】-JVM垃圾回收
  14. 移动apn接入点哪个快_51物联卡:使用物联网卡时为什么总要让你设置APN?
  15. 旭凤锦覓虐心 恋只愿共赴鸿蒙,香蜜:锦觅与旭凤4次同床,1次酒醉灵修,1次再续前缘,1次虐心!...
  16. 解决clion多个mian函数问题
  17. python话圣诞树_python画圣诞树
  18. 关于图片onload事件兼容性处理, 谷歌浏览器版本 56.0.2896.3 (64-bit) 微信客户端浏览器 canvas篇
  19. SQL中去除重复数据的几种方法,我一次性都告诉你​
  20. java操作excel的工具

热门文章

  1. android获取mipmap路径,mipmap 目录和drawable 目录有什么区别
  2. web3js方法获取账户信息和余额
  3. 服务器读取账号密码,WIN服务器得明文密码神器 mimikatz、WCE
  4. FBI都无法破解的iOS设备也会失陷?App store 超千个APP被爆漏洞
  5. word2003里有几处标记删不了每次开启都会显示 如何设置成打开word默认不显示标记
  6. matlab中文件的复制
  7. 【CutMix】《CutMix:Regularization Strategy to Train Strong Classifiers with Localizable Features》
  8. 红米K30至尊版广受消费者欢迎,饥渴营销再现
  9. 国际期货资产管理|期货仓单|期货分仓软件|期货仓单资管软件
  10. 你的计算机usb管理策略,Win2008 R2管理二:组策略之控管USB