Giải mã byte python

Một số người cho rằng việc thực hiện mã hóa/giải mã trong Python là đơn giản và không quan trọng. Nhưng đó là họ chưa gặp phải những vấn đề giải quyết kiến ​​trúc. Thật có thể là Python có hỗ trợ Unicode đầy đủ. Và nhờ vào hàm

utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
2, chúng ta có thể tùy ý thay đổi cách xử lý lỗi

Select back to encoding in Python

Một số khái niệm cơ bản

Trong Python 3, khái niệm chuỗi và byte có nhiều thay đổi lớn. Chúng ta cần nắm lấy một số khái niệm dưới đây

  • Nhân vật. là khái niệm lãng quên, chỉ là một ký hiệu trong một hệ thống chữ viết
  • điểm mã. một số tương ứng với một ký tự nhất định trong một hệ thống quy định. normal ta used Unicode standard
  • byte. is a byte string match with a code point in a encode system system
  • mã hóa. quá trình chuyển đổi từ điểm mã sang byte
  • giải mã. quá trình chuyển ngược từ byte về lại điểm mã

Dưới đây là một số ví dụ

CharacterCode pointByte (ASCII)Byte (UTF-8)1U+0031\x31\x31aU+0061\x61\x61μU+03BCKhông hỗ trợ\xce\xbcụU+1EE5Không hỗ trợ\xe1\xbb\xa5

Trong các ví dụ trên, ta thấy rằng một số điểm mã có thể được mã hóa bằng UTF-8 nhưng lại không thể mã hóa bằng

utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
0. Đó là do
utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
0 chỉ sử dụng 7 bit để mã hóa từng ký tự, trong khi UTF-8 có thể sử dụng tới 4 byte cho mỗi ký tự

Chúng ta không thể mã hóa

utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
2 bằng
utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
0. Và chúng ta cũng không thể giải mã chuỗi byte UTF-8 của
utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
2 bằng
utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
0

'μ'.encode('ASCII')

# Throws: UnicodeEncodeError: 'ascii' codec can't encode character '\u03bc' in position 0: ordinal not in range(128)

data = 'μ'.encode('UTF-8')
data.decode('ASCII')

# Throws: UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 0: ordinal not in range(128)

Trình xử lý xử lý lỗi tích hợp sẵn

Cả hai hàm str. mã hóa và hàm byte. giải mã đều hỗ trợ một số tham số với tên gọi

utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
6. Nếu ta truyền tên của một trình xử lý vào tham số này, thời gian chạy sẽ sử dụng trình xử lý đó để xử lý các lỗi mà nó gặp phải. Dưới đây là các trình xử lý mặc định

utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'

Tự tạo handler để xử lý lỗi

Trong phần lớn các trường hợp, các trình xử lý mặc định là đủ dùng. Nhưng nếu ta muốn sử dụng logic của mình để xử lý lỗi thì ta có thể tự tạo handler

Use register_error function to register register handler mới

Đầu tiên, ta phải thêm handler của mình vào danh sách trong codec mô-đun bằng hàm

utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
7

utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
0

Sau đó, ta có thể truyền cái tên

utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
8 vào tham số
utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
6 như khi sử dụng handler có sẵn

utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
3

Cách tạo trình xử lý mới

Một trình xử lý phải đáp ứng đủ 2 điều kiện dưới đây

  • Get into a number. Khi handler xử lý mã hóa lỗi, tham số này sẽ có kiểu
    utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')
    
    utf8_bytes.decode(encoding='ascii', errors='strict')
    # UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)
    
    utf8_bytes.decode(encoding='ascii', errors='ignore')
    # 'H Ni'
    
    utf8_bytes.decode(encoding='ascii', errors='replace')
    # 'H�� N���i'
    
    utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
    # 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'
    
    utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
    # 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
    
    00. Còn lại khi handler xử lý lỗi giải mã, tham số có kiểu
    utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')
    
    utf8_bytes.decode(encoding='ascii', errors='strict')
    # UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)
    
    utf8_bytes.decode(encoding='ascii', errors='ignore')
    # 'H Ni'
    
    utf8_bytes.decode(encoding='ascii', errors='replace')
    # 'H�� N���i'
    
    utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
    # 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'
    
    utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
    # 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
    
    01. Dưới đây là các trường trong lỗi
    • utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')
      
      utf8_bytes.decode(encoding='ascii', errors='strict')
      # UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)
      
      utf8_bytes.decode(encoding='ascii', errors='ignore')
      # 'H Ni'
      
      utf8_bytes.decode(encoding='ascii', errors='replace')
      # 'H�� N���i'
      
      utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
      # 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'
      
      utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
      # 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
      
      02. mã hóa chuẩn đang được sử dụng
    • utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')
      
      utf8_bytes.decode(encoding='ascii', errors='strict')
      # UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)
      
      utf8_bytes.decode(encoding='ascii', errors='ignore')
      # 'H Ni'
      
      utf8_bytes.decode(encoding='ascii', errors='replace')
      # 'H�� N���i'
      
      utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
      # 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'
      
      utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
      # 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
      
      03. là
      utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')
      
      utf8_bytes.decode(encoding='ascii', errors='strict')
      # UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)
      
      utf8_bytes.decode(encoding='ascii', errors='ignore')
      # 'H Ni'
      
      utf8_bytes.decode(encoding='ascii', errors='replace')
      # 'H�� N���i'
      
      utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
      # 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'
      
      utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
      # 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
      
      04 đang được mã hóa hoặc
      utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')
      
      utf8_bytes.decode(encoding='ascii', errors='strict')
      # UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)
      
      utf8_bytes.decode(encoding='ascii', errors='ignore')
      # 'H Ni'
      
      utf8_bytes.decode(encoding='ascii', errors='replace')
      # 'H�� N���i'
      
      utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
      # 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'
      
      utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
      # 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
      
      05 đang được giải mã
    • utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')
      
      utf8_bytes.decode(encoding='ascii', errors='strict')
      # UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)
      
      utf8_bytes.decode(encoding='ascii', errors='ignore')
      # 'H Ni'
      
      utf8_bytes.decode(encoding='ascii', errors='replace')
      # 'H�� N���i'
      
      utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
      # 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'
      
      utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
      # 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
      
      06. index at first point ta error
    • utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')
      
      utf8_bytes.decode(encoding='ascii', errors='strict')
      # UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)
      
      utf8_bytes.decode(encoding='ascii', errors='ignore')
      # 'H Ni'
      
      utf8_bytes.decode(encoding='ascii', errors='replace')
      # 'H�� N���i'
      
      utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
      # 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'
      
      utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
      # 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
      
      07. index at end point ta error
    • utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')
      
      utf8_bytes.decode(encoding='ascii', errors='strict')
      # UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)
      
      utf8_bytes.decode(encoding='ascii', errors='ignore')
      # 'H Ni'
      
      utf8_bytes.decode(encoding='ascii', errors='replace')
      # 'H�� N���i'
      
      utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
      # 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'
      
      utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
      # 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
      
      08. thông báo lỗi nguyên nhân
  • Trả về một tuple với 2 phần tử
    • Phần tử đầu tiên là giá trị để thay thế cho ký tự ta không thể mã hóa hoặc byte ta không thể giải mã
    • Phần tử thứ 2 là chỉ mục để tiếp tục mã hóa hoặc giải mã

Ví dụ minh họa

Chúng ta sẽ thử tạo handler để thay thế các ký tự lỗi bằng ký tự

utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
09. Ta cũng sẽ ghi lại thông tin chi tiết về lỗi

utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
4

Xử lý lỗi khi mã hóa

Ta sẽ mã hóa dòng chữ

utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
30 bằng tiêu chuẩn
utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
0 và xử lý lỗi với
utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
32

utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
8

The results is as after

utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
9

Có thể thấy hàm

utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
32 đã phát hiện ra 2 vị trí mà
utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
0 không hỗ trợ. Đó là chỉ số
utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
35 và chỉ số
utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
36. Ta đã thay thế cả hai bằng các ký tự
utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
09

Xử lý lỗi khi giải mã

Tương tự trên, ta sẽ giải mã biến

utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
38 đã tạo ở phần trước bằng
utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
0 và
utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
32

utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
3

Dưới đây là kết quả

utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
9

Một điều đáng chú ý ở đây là ký tự

utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
41 được chuyển thành
utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
42, còn
utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
43 được chuyển thành
utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
44. Nguyên nhân do
utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
45 là mã hóa chuẩn với độ dài không cố định. Ký tự
utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
41 được mã hóa bằng 2 byte (
utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
47), còn ký tự
utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
43 được mã hóa bằng 3 byte (_______249). Mỗi khi ta gặp phải một byte trong năm trên,
utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
0 sẽ bị lỗi và thời gian chạy sẽ gọi hàm
utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
32

end

Nếu ta chỉ cần làm việc với tệp

utf8_bytes = 'Hà Nội'.encode(encoding='utf-8')

utf8_bytes.decode(encoding='ascii', errors='strict')
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

utf8_bytes.decode(encoding='ascii', errors='ignore')
# 'H Ni'

utf8_bytes.decode(encoding='ascii', errors='replace')
# 'H�� N���i'

utf8_bytes.decode(encoding='ascii', errors='backslashreplace')
# 'H\\xc3\\xa0 N\\xe1\\xbb\\x99i'

utf8_bytes.decode(encoding='ascii', errors='surrogateescape')
# 'H\udcc3\udca0 N\udce1\udcbb\udc99i'
0 thì vấn đề mã hóa trong Python là đơn giản. Nhưng trong phần lớn các trường hợp, chúng ta sẽ phải sử dụng Unicode. Khi đó, hiểu biết về cách tự viết handler để xử lý lỗi sẽ có ích cho chúng ta