Trong lập trình và xử lý dữ liệu, việc hiểu rõ cách biểu diễn số, đơn vị đo lường và quy tắc mã hóa ký tự là nền tảng thiết yếu. Dưới đây là tổng quan kỹ thuật về các khái niệm này trong bối cảnh hệ thống máy tính và ngôn ngữ Python.
Cách thực thi mã Python
Mã Python có thể được chạy theo hai chế độ chính:
- Chế độ script: Thực thi toàn bộ tập tin mã nguồn.
python3 /home/user/project/exercises/solution.py
- Chế độ tương tác: Nhập từng lệnh trực tiếp vào môi trường REPL.
python3
Hệ đếm và chuyển đổi cơ số
Tất cả dữ liệu trong máy tính đều được lưu trữ dưới dạng chuỗi bit nhị phân (0 và 1), bất kể đó là văn bản, hình ảnh hay âm thanh.
Các hệ đếm phổ biến gồm:
- Nhị phân (base-2): chỉ dùng hai ký số
0,1. - Bát phân (base-8): ký số từ
0đến7. - Thập phân (base-10): hệ quen thuộc nhất với con người.
- Thập lục phân (base-16): sử dụng chữ số
0–9và chữ cáia–f(hoặcA–F).
Python cung cấp các hàm dựng sẵn để chuyển đổi giữa các hệ:
# Chuyển từ thập phân sang các hệ khác
binary_repr = bin(42) # → '0b101010'
octal_repr = oct(42) # → '0o52'
hex_repr = hex(42) # → '0x2a'
# Chuyển ngược lại từ chuỗi biểu diễn sang số nguyên
decimal_from_bin = int('101010', 2) # → 42
decimal_from_oct = int('52', 8) # → 42
decimal_from_hex = int('2a', 16) # → 42
Đơn vị lưu trữ dữ liệu
Vì dữ liệu được xử lý ở mức bit, các đơn vị chuẩn được định nghĩa dựa trên bội số của 2:
- bit (b): đơn vị nhỏ nhất — một giá trị nhị phân duy nhất (
0hoặc1). - byte (B): bằng 8 bit — đơn vị cơ bản để truy cập dữ liệu trong hầu hết kiến trúc máy tính.
- KiB (kibibyte): 1024 byte (không phải 1000 — do gốc nhị phân).
- MiB, GiB, TiB: lần lượt là $1024^2$, $1024^3$, $1024^4$ byte.
Các tiền tố lớn hơn như PiB, EiB, ZiB, YiB cũng tuân theo quy tắc nhân 1024.
Mã hóa ký tự
Mã hóa là bảng ánh xạ giữa ký tự (character) và dãy bit tương ứng, cho phép lưu trữ và truyền tải văn bản.
ASCII
Dùng 1 byte (8 bit) để biểu diễn tối đa 256 ký tự — chủ yếu phục vụ tiếng Anh và ký hiệu toán học cơ bản. Ví dụ: ký tự 'A' có mã thập phân 65 → nhị phân 01000001.
GBK và GB2312
Là các chuẩn mã hóa dành riêng cho tiếng Trung, phát triển bởi Ủy ban Tiêu chuẩn Quốc gia Trung Quốc. GB2312 (1980) hỗ trợ khoảng 6.763 ký tự Hán tự; GBK (1995) mở rộng để bao gồm thêm chữ Nhật, Hàn và ký tự bổ sung — sử dụng cả mã 1 byte (cho ASCII) và 2 byte (cho ký tự Hán).
Unicode
Là tiêu chuẩn quốc tế nhằm gán một code point duy nhất cho mỗi ký tự trên thế giới. Các dạng triển khai phổ biến:
- UCS-2: biểu diễn cố định bằng 2 byte (16 bit) — hiện đã lỗi thời do không hỗ trợ Unicode ngoài vùng BMP.
- UCS-4 / UTF-32: biểu diễn cố định bằng 4 byte — đảm bảo độ nhất quán nhưng tốn băng thông.
Cả hai phương pháp trên đều gây lãng phí bộ nhớ khi mã hóa ký tự ASCII (ví dụ: 'A' vẫn chiếm 2 hoặc 4 byte thay vì 1).
UTF-8
Là mã hóa biến chiều phổ biến nhất hiện nay, được thiết kế để tương thích ngược với ASCII và tối ưu dung lượng:
| Phạm vi code point (hex) | Số byte trong UTF-8 | Mẫu bit |
|---|---|---|
U+0000 – U+007F |
1 | 0xxxxxxx |
U+0080 – U+07FF |
2 | 110xxxxx 10xxxxxx |
U+0800 – U+FFFF |
3 | 1110xxxx 10xxxxxx 10xxxxxx |
U+10000 – U+10FFFF |
4 | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
Ví dụ:
'B'có code pointU+0042→ nằm trong dải 1-byte → mã hóa thành01000010.'武'có code pointU+6B66→ dải 3-byte → mã hóa thành11100110 10101101 10100110.'😆'có code pointU+1F606→ dải 4-byte → mã hóa thành11110000 10011111 10011000 10000110.
Xử lý mã hóa trong Python
Python phân biệt rõ ràng giữa:
str: chuỗi ký tự Unicode (được xử lý nội bộ trong bộ nhớ).bytes: dãy byte nhị phân (dùng khi ghi file, gửi mạng hoặc tương tác với hệ thống).
Chuyển đổi giữa hai loại:
text = "Xin chào Việt Nam"
utf8_bytes = text.encode("utf-8") # str → bytes
gbk_bytes = text.encode("gbk") # cần cài đặt hỗ trợ nếu dùng trên hệ thống không có GBK
# Ghi vào tệp nhị phân
with open("output.bin", "wb") as f:
f.write(utf8_bytes)