字元編碼學習記錄
阿新 • • 發佈:2018-12-08
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%