Python(3)字符串的编码、长度、占

2023-01-31 01:01:42 字符串 编码 长度

3、字符串和编码的转换

1、转换单个字符为编码:

ord(c)

返回值可以认为是数字类型。

foo = '中'
print(ord(foo))     # 20013

如果不止一个字符,则会报错

2、转换单个字符的编码为字符

chr(code)

返回值是字符

print(chr(20013))     # '中'

3、用unicode方式输出字符

\u十六进制编码

例如,20013转为十六进制是4E2D

print('\u4e2d')     # '中'

4、将字符转为bytes形式的编码

首先,当字符串前面有b时表示是bytes形式的编码。

例如,b'\xe4\xb8\xad'表示文字。这个东西一般是需要进行网络传输,或者在硬盘上读写时使用的。

str.encode(encoding=’UTF-8’,errors=’strict’)

附个中文说明吧,找不到类似MDN这样的完善的说明网站。

两个参数都可以省略,默认转为utf-8格式。其作用大致类似js里的encodeURI()方法,虽然我并不能完全肯定其是否一样。

示例:

foo = '中'.encode('utf-8')
print(foo)  # b'\xe4\xb8\xad'

5、从bytes形式的编码转回普通字符串

属于上面的逆向行为。

bytes.decode(encoding=”utf-8”, errors=”strict”)

foo = b'\xe4\xb8\xad'.decode()
print(foo)  # '中'

4、字符串的长度

len(o)

参数是被检查的字符串。

这个比较智能:

  1. 对普通字符串,返回其字符个数,例如len('中')的返回值是1(只有一个字符);
  2. 对于bytes形式的编码,返回其字节数。例如len(b'\xe4\xb8\xad')的返回值是3;
  3. 对于普通字符串,像\n这样的换行符或者其他转义字符,其长度视为1;
  4. 但假如字符串前面加了r(视为非转义字符),那么\n的长度则视为2;
len('中')    # 1
len(b'\xe4\xb8\xad')    # 3
len('a\nb')    # 3
len(r'a\nb')    # 4

5、字符串的替换/占位符

简单来说,占位符就是先占住一个固定的位置,然后用其他东西替换这个位置的内容。

如果玩过C语言,那么应该很熟悉。

标准占位符是:%d,注意是小写的,其他占位符也一样是小写。

通用写法是:

foo = '→%s←' % ('abc')
print(foo)  # 箭头指向的地方被替换的→abc←

占位符的数量和括号里的参数数量要一致,不然抛错

因为上面只有一个占位符,所以括号可以省略。

foo = '→%s←' % 'abc'
print(foo)  # →abc←

整数占位符(%d)

参数可以是浮点数(小数)或整数,浮点数的话直接取整数位使用。

foo = '%d' % (1.9)
print(foo)  # 1

整数占位符的补位写法:

%和后面的d之间添加两个数字,可以表示补足到多少位内容和以什么字符来补。

常见写法是补零,如示例:

foo = '%03D' % 1
print(foo)  # 001

%后面跟的第一个是0,表示用0是补位内容;第二个字符开始至d之前的字符是3,表示补足到三位。

具体来说,就是首先用1来替换%03d的位置,替换后结果是1

然后发现第二个至d之间是3,表示要补足3位,即xx1这样。

但这个x是什么呢?发现第一位是0,因此变成001,即结果。

两种特殊情况:

  1. 假如被替换后超出三位,例如foo = '%03d' % 1234替换后结果是1234。这种情况不补位;
  2. 可以用其他填充么?答案是不行。

浮点数占位符(%f)

会把参数变为一个六位小数,然后替换。

示例:

foo = '%f' % 2.1234
print(foo)  # 2.123400

也可以只取几位小数,写法是 %f 之间加 . 和需要保留的位数。

示例:

foo = '%.2f' % 2.1234
print(foo)  # 2.12

另外需要注意,浮点数由于精确度问题,因此最后一位并不是四舍五入,也不是直接舍去后面的内容。

这涉及到浮点数的存储问题,就不深谈了。

转为十六进制(%x)

很好理解,将数字转为十六进制

foo = '%x' % 31
print(foo)  # 1f

另外提一下十六进制转为十进制的方法:

foo = '1f'    # 这里需要是字符串
print(int(foo, 16))  # 31

相关文章