第六章:文件系统-codecs:字符串编码和解码-Unicode入门

article/2025/8/26 13:07:20

6.10 codecs:字符串编码和解码
codecs模块提供了流接口和文件接口来完成文本数据不同表示之间的转换。通常用于处理Unicode文本,不过也提供了其他编码来满足其他用途。

6.10.1 Unicode入门
CPython 3.x区分了文本(text)和字节(byte)串。bytes实例使用一个8位字节值序列。与之不同,str串在内部作为一个Unicode码点(code point)序列来管理。码点值使用2字节或4字节表示,这取决于编译Python时指定的选项。
输出str值时,会使用某种标志机制编码,以后可以将这个字节序列重构为同样的文本串。编码值的字节不一定与码点值完全相同,编码只是定义了两个值集之间转换的一种方式。读取Unicode数据时还需要知道编码,这样才能把接收到的字节转换为unicode类使用的内部表示。
西方语言最常用的编码是UTF-8和UTF-16,这两种编码分别使用单字节和两字节值序列表示各个码点。对于其他语言,由于大多数字符都由超过两字节的码点表示,所以使用其他编码来存储可能更为高效。

编码
要了解编码,最好的方法就是采用不同方式对相同的串进行编码,并查看所生成的不同的字节序列。下面的例子使用以下函数格式化字节串,使之更易读。

# codecs_to_hex.py
import binasciidef to_hex(t,nbytes):"""Format text t as a sequence of nbytes long valuesseparated by spaces."""chars_per_item = nbytes * 2hex_version = binascii.hexlify(t)return b' '.join(hex_version[start:start + chars_per_item]for start in range(0,len(hex_version),chars_per_item))if __name__ == '__main__':print(to_hex(b'abcdef',1))print(to_hex(b'abcdef',2))

这个函数使用binascii得到输入字节串的十六进制表示,在返回这个值之前每隔nbytes字节就插入一个空格。
运行结果:
在这里插入图片描述
第一个编码示例首先使用unicode类的原始表示来打印文本‘francais’,后面是Unicode数据库中各个字符的名。接下来两行将这个字符串分别编码为UTF-8和UTF-16,并显示编码得到的十六进制值。

import unicodedata
from codecs_to_hex import to_hextext = 'francais'print('Raw    : {!r}'.format(text))
for c in text:print('  {!r}: {}'.format(c,unicodedata.name(c,c)))print('UTF-8  : {!r}'.format(to_hex(text.encode('utf-8'),1)))
print('UTF-16 : {!r}'.format(to_hex(text.encode('utf-16'),2)))

对一个str编码的结果是一个bytes对象。
运行结果:
在这里插入图片描述
给定一个编码字节序列(作为一个bytes实例),decode()方法将其转换为码点,并作为一个str实例返回这个序列。

from codecs_to_hex import to_hextext = 'francais'
encoded = text.encode('utf-8')
decoded = encoded.decode('utf-8')print('Oruginal :',repr(text))
print('Encoded  :',to_hex(encoded,1),type(encoded))
print('Decoded  :',repr(decoded),type(decoded))

选择使用哪一种编码不会改变输出类型。
运行结果:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/UF4yPyCx.shtml

相关文章

Java中的方法重载

1.方法重载概述 方法重载指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法相互构成重载: 多个方法在同一个类中多个方法具有相同的方法名多个方法的参数不相同,类型不同或者数量不同 2.方法重载特点 重载仅对应方法的定义&a…

java方法命名规范(持续更新)

前言:命名的目的是见名知意。业界目前没有强制的命名规范,但是用过了JPA之类的人,自己新建DAO层的方法的时候,也有一个参考,所以,用hibernate那一套,其实挺好的,维护起来也是很方便。…

java的静态方法

Java中方法分为静态方法和普通方法 所谓静态方法,就是方法前面加上static关键字,调用静态方法时一般用类名.方法名,当然也可以用对象名.方法名; 一般Java中工具类里面的工具方法都用static修饰,作为静态方法&#xff1…

java中方法的调用

1.静态方法调用静态方法: 用静态方法时通过(类名.方法名)的方法进行调用,当调用方法和被调用的方法在同一类中时,类名可省略,直接通过方法名进行调用; 同时也可以通过对象进行调用,但…

Java泛型方法

Java泛型方法 在学习Java泛型方法之前,我希望你们针对于Java泛型类有一定的了解并且可以熟练的使用。若了解并不是很详细。可以观看我写的另一篇文章 (也是我写的) Java泛型类 来了解一下。 呢么我们速度过一下泛型方法。其实泛型方法并不难理解。 我们直接上代码来…

Java方法返回值类型归纳

Java方法返回值类型归纳 我们再调用一个方法时,将方法体内产生的一条数据输出到方法体外使用,这条数据我们叫做返回值。 返回值类型分为两大类:第一类,无返回值类型:void。第二类,有返回值类型&#xff0…

java 一般方法_java有哪些方法

java有哪些方法 定义一个完整的类方法,需要六个步骤,也就是六大部分。也因为这六个部分的不同而可以大概分为9种方法。 一、一般方法 二、构造方法 三、无参无返回值的方法。 四、无参有返回值的方法。 五、有参无返回值的方法。 六、有参有返回值的方法…

java怎么返回数组_java方法怎么返回数组

java方法返回数组的方法:在方法前添加int[]即可返回一维的整型数组。如果在方法前添加int[][],则可以返回二维的整型数组。 Java是一门面向对象编程语言,不仅吸收了C语言的各种优点,还摒弃了C里难以理解的多继承、指针等概念&…

java 调用方法 数组_JAVA方法与数组

一、JAVA的方法: 1、定义:a、java方法是语句的集合,它们在一起执行一个功能。 b、方法是解决一类问题的步骤的有序组合。 c、方法包含于类或对象中。 d、方法在程序中被创建,在其他地方被引用。 2、设计方法的原则:一个方法只能完成1个功能,最好保持方法的原子性。 3、语…

教妹学Java(二十四):一文了解 Java 中的方法

你好呀,我是沉默王二,CSDN 排名前十的博客专家。这是《教妹学 Java》专栏的第二十四篇,我们来了解一下 Java 中的方法——什么是方法?如何声明方法?方法有哪几种?什么是实例方法?什么是抽象方法…

java方法详解

java方法:(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集,并且能实现达到代码复用的效果 java方法包含于类或对象中(在面向对象的时候我们就知道,其实类和对象是…

【Java】保姆级“方法“教学

目录 一、前言 二、方法 1、方法的概述 2、方法的定义和调用 格式1: 示例图1: 示例图2: 代码1: 代码2: 格式2: 修饰符访问权限范围: 本章主要内容: 3、带参数方法的定义和调用 方法定…

java方法(超详细)

一、概述 方法,也称函数,如果想要重复一段或者多段代码块的使用,可以将这些代码封装成一个方法,方法具体表现为某种行为,使用方法可以提高代码的复用性。 二、方法的声明 1.组成 访问权限符 返回值 方法名&#x…

【自然语言处理】3. NMT机器翻译案例实战(基于TensorFlow Addons Networks with Attention Mechanism)

NLP系列讲解笔记 本专题是针对NLP的一些常用知识进行记录,主要由于本人接下来的实验需要用到NLP的一些知识点,但是本人非NLP方向学生,对此不是很熟悉,也是因为本人对NLP灰常感兴趣,想扎进去好好研究研究,所…

使用NMT和pmap解决JVM资源泄漏问题

NMT NMT是Native Memory Tracking的缩写,一个JDK自带的小工具,用来跟踪JVM本地内存分配情况(本地内存指的是non-heap,例如JVM在运行时需要分配一些辅助数据结构用于自身的运行)。 NMT功能默认关闭,可以在J…

机器翻译-subword-nmt预处理语料

在机器翻译中,目前都采用的方法是bpe切分子词的方法来处理翻译中的未登录词。 如何使用? https://github.com/rsennrich/subword-nmt这里面已经写了详细的方法,本文主要记录我处理中英语料时的步骤。 1.共享词典 直接clone了这个项目&…

学习CANopen --- [3] NMT报文

本文主要讲述CANopen中的NMT报文,即网络管理(Network ManagemenT),该服务可以用于启动网络和监控设备。 NMT报文由NMT主机发送,对从机进行启动、监控和重启,在CANopen网络中只允许有一个活动的NMT主机。如…

论文引介 | NMT with Conditional Sequence Generative Adversarial Nets

文章原名:Improving Neural Machine Translation with Conditional Sequence Generative Adversarial Nets 作者:Zhen Yang, Wei Chen, Feng Wang and Bo Xu 单位:Institute of Automation, Chinese Academy of Sciences 译者:韩旭…

NMT对抗训练的三部曲

来自:天宏NLP 进NLP群—>加入NLP交流群 本文主要介绍NMT模型鲁棒性的相关改进工作,介绍一下对抗训练的三部曲,一作皆是ChengYong,分别中了2018,2019和2020的ACL。 第一项工作为 Towards Robust Neural Machine Tran…

手把手教你用fairseq训练一个NMT机器翻译系统

以构建英-中NMT为例,在linux上运行,fairseq版本为0.8.0 环境准备 Requirements: fairseq:pytorch包,包括许多网络结构,https://github.com/pytorch/fairseqmosesdecoder:机器翻译的标准数据处…