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ỗiSelect 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\xa5Trong 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 địnhutf8_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'
7utf8_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'
0Sau đó, 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ẵnutf8_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'
3Cá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
00. Còn lại khi handler xử lý lỗi giải mã, tham số có kiểuutf8_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ỗiutf8_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ụngutf8_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ặcutf8_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 errorutf8_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 errorutf8_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ânutf8_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'
- 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ỗiutf8_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'
4Xử 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'
32utf8_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'
8The 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'
9Có 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'
09Xử 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'
32utf8_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'
3Dướ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'
9Mộ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'
32end
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