1. 程式人生 > >字元編碼學習記錄

字元編碼學習記錄

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%