字符编码学习记录

1、字节

  • 1字节(byte)=8比特(bit);
  • 一个字节能表示的最大数字是2^8-1=255;
  • 一个英文字母是一个字符;
  • 一个汉字是一个字符;

2、编码

  • ASCII编码,占1个字节,美国使用,只有127个字符,包括大小写英文字母、数字和符号,例如大写字母A编码为65,小写字母z编码为122
  • 中国的中文编码为GB2312,一个汉字占用2个字节;
  • 日本的日文编码为Shift_JIS
  • 韩国的韩文编码为Euc-kr

在多语言混合的文本中,会显示乱码

  • Unicode编码把所有语言都统一到一套编码里,一般有2个字节;
  • UTF-8编码,可变长编码,把一个Unicode字符根据不同的数字大小编码成1-6个字节,节省空间,英文字母占用1个字节,常用汉字占用3个字节,生僻的字符占用4-6个字节;

ASCII可以看做UTF-8的一部分

3、现在计算机系统通用的字符编码工作方式:

  • 在内存中以Unicode形式存在,在硬盘中以UTF-8形式存在;

  • 在python中用ord()函数和chr()函数转换字符和编码;
    例如(python3):

import sys
print(ord('A'))
print(chr(65))

显示如下:

65
A

print('\u4e2d\u6587') # '\u'指的是十六进制的Unicode编码,可以直接和单个字符转换

显示如下:

中文

  • 字符串类型是str,在网络上传输或者保存到磁盘上就需要变为以字节为单位的bytes(字节流)

encode用来把字符串转换为bytes形式

print('ABC'.encode('ascii'))
print( '中文'.encode('utf-8'))

显示如下:

b’ABC’
b’\xe4\xb8\xad\xe6\x96\x87’

\x指的是UTF-8编码

decode用来把bytes形式转换为字符串

print(b'ABC'.decode('ascii'))
print(b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8'))

显示如下:

ABC
中文

如果bytes中包含无法解码的字节,decode()方法会报错
如果bytes中只有一小部分无效的字节,可以传入errors='ignore'忽略错误的字节:

print(b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore'))

显示如下:

当Python解释器读取源代码时,为了让它按UTF-8编码读取,通常在文件开头写上以下两行:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

4、格式化字符串

print( 'Hi, %s, you have $%d.' % ('Michael', 1000000)) #如果只有一个变量,括号可以去掉

显示如下:

Hi, Michael, you have $1000000.

  • %s用字符串替换
  • %d用整数替换
  • %f用浮点数替换
  • %x用十六进制整数替换
print('%2d-%013d' % (3, 10))

显示如下:

3-0000000000010

%013d表示把整数变成13位数,不够13位的在前面用数字0补齐
%2d表示把整数变成2位数,不够两位的在前面用空格补齐

print('%.3f' % 3.1415926)
print('%.3f' % 3.1)

显示如下:

3.142
3.100

%.3f表示把浮点数在小数点后保留3位,小数点后不够3位的用数字0补齐
如果%是字符串中的普通字符,用%%表示%
例如:

print('考试通过率: %d%%' % 80)

显示如下:

考试通过率: 80%

猜你喜欢

转载自blog.csdn.net/blackeagleoht/article/details/84892072