关于 Python3 的编码(walker)

Python3 中 str 与 bytes 的转换

bytes

字符与 Unicode 编号之间的转换

  • 字符转 Unicode 编号
>>> ord('A')
65
>>> hex(ord('A'))
'0x41'

>>> ord('你')
20320
>>> hex(ord('你'))
'0x4f60'

>>> '你好'.encode('unicode_escape')
b'\\u4f60\\u597d'
  • Unicode 编号转字符
>>> chr(65)
'A'
>>> chr(0x41)
'A'

>>> chr(20320)
'你'
>>> chr(0x4f60)
'你'

>>> b'\\u4f60\\u597d'.decode(('unicode_escape'))
'你好'
>>> print(b'\\u4f60\\u597d')
b'\\u4f60\\u597d'
>>> print(u'\u4f60\u597d')
你好

汉字与 gbk 十六进制/二进制之间的转换

# 汉字转十六进制
>>> '你好'.encode('gbk')
b'\xc4\xe3\xba\xc3'

# 十六进制转汉字
>>> b'\xc4\xe3\xba\xc3'.decode('gbk')
'你好'

# 汉字转十六进制字符串
>>> ''.join( [ '%02X' % x for x in '你好'.encode('gbk') ] ).strip()
'C4E3BAC3'
>>> ' '.join( [ '%02X' % x for x in '你好'.encode('gbk') ] ).strip()
'C4 E3 BA C3'

# 十六进制字符串转汉字
>>> bytes.fromhex('C4E3BAC3').decode('gbk')
'你好'
>>> bytes.fromhex('C4 E3 BA C3').decode('gbk')
'你好'

数字与十六进制之间的转换

# 数字转十六进制字符串
>>> hex(21)
'0x15'
>>> hex(21)[2:]
'15'

# 十六进制字符串转数字
>>> int('0x15', 16)
21
>>> int('15', 16)
21

数字与八进制之间的转换

# 数字转八进制字符串
>>> oct(21)
'0o25'
>>> oct(21)[2:]
'25'

# 八进制字符串转数字
>>> int('0o25', 8)
21
>>> int('25', 8)
21

数字与二进制之间的转换

# 数字转二进制字符串
>>> bin(5)
'0b101'
>>> bin(5)[2:]
'101'

# 二进制字符串转数字
>>> int('0b101', 2)
5

>>> int('101', 2)
5

bytes 相关

# bytes 对象转十六进制字符串
>>> "%02X" % ord(b'\xff')
'FF'
>>>  ''.join(["%02X" % i for i in b'\xe4\xbd\xa0\xe5\xa5\xbd'])
'E4BDA0E5A5BD'

# bytes 转 int
>>> ord(b'\xff')
255

# int 转 bytes
>>> bytes([255])
b'\xff'

bit 相关

# 字符串转 01 串(默认 endian 是大端)
>>> arr = bitarray()
>>> arr.frombytes('你好'.encode('utf8'))
>>> arr.to01()
'111001001011110110100000111001011010010110111101'

# 01 串转字符串
>>> bitarray('111001001011110110100000111001011010010110111101').tobytes().decode('utf8')
'你好'

关于 utf8 的 bom 头

>>> import codecs
>>> codecs.BOM_UTF8
b'\xef\xbb\xbf'
>>> len(b'\xef\xbb\xbf')
3
>>> codecs.BOM_UTF8.decode('utf8')
'\ufeff'
>>> len('\ufeff')
1

Python3 内置编码

>>> from encodings.aliases import aliases
>>> for k in aliases:
    print('%s: %s' % (k, aliases[k]))
  • 验证是不是有效编码
>>> import codecs

>>> codecs.lookup('utf8')    #有效
<codecs.CodecInfo object for encoding utf-8 at 0x13fb4f50828>

>>> codecs.lookup('utf-;8')    #有效
<codecs.CodecInfo object for encoding utf-8 at 0x13fb4f50a08>

>>> codecs.lookup('utf88')    #无效
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    codecs.lookup('utf88')
LookupError: unknown encoding: utf88
  • 标准化 encoding
>>> import encodings
>>> encodings.normalize_encoding('utf-;8')
'utf_8'

对应 C 代码为:unicodeobject.c中的 __Py_normalize_encoding_函数。

import sys
import locale
 
# 当前系统所使用的默认字符编码
>>> sys.getdefaultencoding()
'utf-8'
 
# 用于转换 Unicode 文件名至系统文件名所使用的编码
>>> sys.getfilesystemencoding()
'utf-8'
 
# 获取默认的区域设置并返回元组(语言, 编码)
>>> locale.getdefaultlocale()
('zh_CN', 'cp936')
 
# 返回用户设定的文本数据编码
# 文档提到this function only returns a guess
>>> locale.getpreferredencoding()
'cp936'

字符串反转

>>> line = '0123456789'
>>> line[::-1]
'9876543210'
本文出自 walker snapshot
Image placeholder
Walker
未设置
  39人点赞

没有讨论,发表一下自己的看法吧

推荐文章
Python 教程-了解Python

什么是Python Python能干什么? 有什么特点? 什么是Python 官方介绍: Python是一个易于学习、功能强大的编程语言。它拥有高效高级的数据结构和一种简单有效的面向对象编程的

Python 教程-Python 安装

在Windows上安装 访问https://www.python.org/downloads/并下载最新版本。在撰写时当前最新是3.8。在安装的时候和其他软件一样,无脑式下一步。需要注意的是如果在W

Python入门教程_2. 使用 Python 解释器

2.1.调用解释器 Python解释器通常安装在目标机器上的/usr/local/bin/python3.7目录下;把/usr/local/bin目录放进你的Unixshell的搜索路径里,确保它可以

Python入门教程_3. Python 简介

在下面的例子中,输入和输出分别由大于号和句号提示符(>>>和...)标注:如果想重现这些例子,就要在解释器的提示符后,输入(提示符后面的)那些不包含提示符的代码行。需要注意的是在练习中遇到的从属提示符

Python入门教程_4. 深入 Python 流程控制

除了刚刚介绍的while语句,Python还有一些在其他语言中常见的控制流语句,并做了一些改动。 4.1.if语句 也许最著名的语句是if语句了。 例如: >>>x=int(input("Please

【python测试开发栈】帮你总结python random模块高频使用方法

随机数据在平时写python脚本时会经常被用到,比如随机生成0和1来控制逻辑、或者从列表中随机选择一个元素(其实抽奖程序也类似,就是从公司所有人中随机选择中奖用户)等等。这篇文章,就帮大家整理在pyt

流畅的Python读书笔记 --- 第一章 Python数据模型

近期开始读“流畅的Python”这本书,想把自己的读书笔记分享给大家,希望能帮到也对这本书感兴趣但是没时间看的各位。(文章中大部分的话和图片摘录总结自“流畅的Python”一书,以及python官方网

【python测试开发栈】帮你总结python time模块高频使用方法

在平时写python脚本时,时间是我们经常用到的数据,比如:时间戳、前端展示的对应格式的时间等,在python中主要有三个和时间处理相关的模块:time、datetime、calendar,这篇文章主

最受欢迎的编程语言排行:Python与Java谁更受欢迎?

Python在全球开发人员中的受欢迎程度急剧上升,专注于研究开发人员的SlashData最近公布了实际使用该语言的开发人员数量。根据SlashData的数据,目前世界上有820万使用Python编写代

1.1. 建造者模式(Builder)

1.2.1.目的 建造者是创建一个复杂对象的一部分接口。 有时候,如果建造者对他所创建的东西拥有较好的知识储备,这个接口就可能成为一个有默认方法的抽象类(又称为适配器)。 如果对象有复杂的继承树,那么

实操讲解:使用Keras中的自动编码器进行极端罕见事件分类

在这篇文章中,我们将学习如何实现用自动编码器来构建稀有事件分类器。我们将使用来自此处的真实稀有事件数据集。背景什么是极端罕见的事件?在一个罕见的问题中,我们有一个不平衡的数据集。意思是,我们得到的阳性

超8千Star,火遍Github的Python反直觉案例集!

大数据文摘授权转载作者:SatwikKansal译者:暮晨Python,是一个设计优美的解释型高级语言,它提供了很多能让程序员感到舒适的功能特性。但有的时候,Python的一些输出结果对于初学者来说似

面向回家编程!GitHub标星两万的”Python抢票教程”,我们先帮你跑了一遍

盼望着,盼望着,春节的脚步近了,然而,每年到这个时候,最难的,莫过于一张回家的火车票。据悉,今年春运期间,全国铁路发送旅客人次同比将增长8.0%。达到4.4亿人次,2020年铁路春运自1月10日开始,

深度复盘GitHub发展史:如何在短短10年内改变了人们的编程方式?

前不久,微软以75亿美元的价格收购GitHub,引发了科技行业的关注。在短短的10年内,GitHub改变了人们的编程方式。不仅让编程变得更简单,还改变了软件开发者对编程的看法。GitHub是如何做到的

Python 多个return值

多个return值 那如果你想从一个函数里返回两个变量而不是一个呢?新手们有若干种方法。最著名的方法,是使用global关键字。让我们看下这个没用的例子: defprofile(): globalna

python 处理多个异常

处理多个异常 我们可以使用三种方法来处理多个异常。 第一种方法需要把所有可能发生的异常放到一个元组里。像这样: try: file=open('test.txt','rb') except(IOErr

python *args 的用法

*args的用法 *args和**kwargs主要用于函数定义。你可以将不定数量的参数传递给一个函数。 这里的不定的意思是:预先并不知道,函数使用者会传递多少个参数给你,所以在这个场景下使用这两个关键

python **kwargs 的用法

**kwargs的用法 **kwargs允许你将不定长度的键值对,作为参数传递给一个函数。如果你想要在一个函数里处理带名字的参数,你应该使用**kwargs。 这里有个让你上手的例子: defgree

Python 使用 CTypes调用 C 方法

CTypes Python中的ctypes模块可能是Python调用C方法中最简单的一种。ctypes模块提供了和C语言兼容的数据类型和函数来加载dll文件,因此在调用时不需对源文件做任何的修改。也正

Python/C API

Python/CAPI Python/CAPI可能是被最广泛使用的方法。它不仅简单,而且可以在C代码中操作你的Python对象。 这种方法需要以特定的方式来编写C代码以供Python去调用它。所有的P

SWIG-Python中调用C代码的另一种方法

SWIG SWIG是SimplifiedWrapperandInterfaceGenerator的缩写。是Python中调用C代码的另一种方法。在这个方法中,开发人员必须编写一个额外的接口文件来作为S

Python 容器 Collections

容器(Collections) Python附带一个模块,它包含许多容器数据类型,名字叫作collections。我们将讨论它的作用和用法。 我们将讨论的是: defaultdict counter

python __slots__ 魔法

在Python中,每个类都有实例属性。默认情况下Python用一个字典来保存一个对象的实例属性。这非常有用,因为它允许我们在运行时去设置任意的新属性。 然而,对于有着已知属性的小类来说,它可能是个瓶颈

python set (集合)数据结构

set(集合)是一个非常有用的数据结构。它与列表(list)的行为类似,区别在于set不能包含重复的值。这在很多情况下非常有用。例如你可能想检查列表中是否包含重复的元素,你有两个选择,第一个需要使用f

python 协程

Python中的协程和生成器很相似但又稍有不同。主要区别在于: 生成器是数据的生产者 协程则是数据的消费者 首先我们先来回顾下生成器的创建过程。我们可以这样去创建一个生成器: deffib():

{