chapter4 文本和字节序列

字符问题

Unicode 标准把字符的标识和具体的字节表述进行了明确区分

  • 字符的标识,即码位,是0-1114111的数字(十进制)
  • 编码是在码位与字节序列之间转换时使用的算法。
    把码位转换为字节序列是编码,把字节序列转为码位是解码

字节概要

python内置了两种基本的二进制序列类型:

  • bytes:python3引入的不可变类型
  • bytearray: 可变类型
    bytes或bytearray对象的各个元素是介于0-255(含)之间的整数。二进制序列的切片始终是同一类型的二进制序列,包括长度为1的切片。
    虽然二进制序列其实是整数序列,但是它们的字面量表示法表明其中有ASCII文本。因此,各个字节的值可能会使用下列三种不同的方式显示。
  • 可打印的ASCII范围内的字符(从空格到~)。使用ASCII字符本身。
  • 制表符,换行符,回车符和* 对应的字节,使用转义序列\t,\n,\r* 和\.
  • 其他字节的值,使用十六进制转义序列(例如, \x00是空字节)
    构建bytes或bytearray实例还可以调用各自的构造方法,传入下述参数。
  • 一个str对象和一个encoding关键字参数
  • 一个可迭代对象,提供0~255之间的数值。
  • 一个整数,使用空字节创建对应长度的二进制序列。python3.6会将其删除
  • 一个实现了缓冲协议的对象(如bytes,bytearray,memoryview,array.array);此时,把源对象中的字节序列复制到新建的二进制序列中.
    注意 - 使用缓冲类对象创建bytes或者bytearray对象时,始终复制源对象中的字节序列。与之相反,memoryview对象允许在二进制数据结构之间共享内存。

结构体和内存视图

struct模块提供了一些函数,能处理bytes,bytearray和memoryview对象。

基本的编解码器

utf-8之类的

了解编码问题

  • UnicodeEncodeError: 把字符串转成二进制序列时
  • UnicodeDecodeError: 把二进制序列转换为字符串时
  • SyntaxError: 源码的编码与预期不符。

处理文本文件

处理文件的最佳实践是‘Unicode三明治’。

  • 尽早把输入(例如读取文件)的字节序列解码成字符串。
  • 在其他处理过程中,一定不能编码或解码
  • 对输出来说,则要尽量晚的把字符串编码成字节序列。

为了正确比较而规范化Unicode字符串。

因为Unicode有组合字符。一个单词可能有两种方式构成,分别会有4个或者5码位。但是结果是完全一样的,在python中,因为看到的是不同的码位序列,因此判定二者不相等。
解决这个问题可以使用unicodedata.normalize函数提供的Unicode规范化。

  • NFC :使用最少的码位构成等价的字符串
  • NFD :把组合字符分解成基字符和单独的组合字符。
  • NFKC : 兼容模式
  • NFKD :兼容模式
    上面的两种兼容模式规范化形式只能在特殊情况下使用,例如搜索和索引。不能用于持久存储。

大小折叠

大小写折叠其实就是把所有文本转为小写,再做些其他转换。这个功能由str.casefold()方法支持。

去掉变音符合

思路:

  • 使用NFD规范化unicode字符。分解为基字符和组合记号
  • 过滤所有组合记号
  • 重组所有字符

Unicode文本排序

可以使用PyUCA库。

Unicode 数据库

Unicode标准提供了一个完整的数据库,不仅包括码位与字符名称之间的映射,还有各个字符的元数据,以及字符之间的关系。

  • unicodedate.name()
  • unicodedata.numeric()
  • .isdecimal():
  • .isnumeic():

支持字符串和字节序列的双模式API

re和os模块

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容

  • 内置函数Python解释器内置了许多功能和类型,总是可用的。他们是按字母顺序列在这里。 abs(x)返回一个数的绝...
    uangianlap阅读 1,236评论 0 0
  • 在当前这个时代(比如说公元2016年),如果你并不是在维护历史遗留的文本处理代码,没有在每个地方都使用Unicod...
    纵横而乐阅读 2,760评论 3 16
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,652评论 18 139
  • 字符集和编码简介 在编程中常常可以见到各种字符集和编码,包括ASCII,MBCS,Unicode等字符集。确切的说...
    兰山小亭阅读 8,488评论 0 13
  • "内向"对以前的小D来说是个贬义词,因为内向,他不爱发言,即使那道题他会,他也想回答,但是只能眼睁睁看着别人起来大...
    许CC阅读 207评论 2 3