Mã hóa ký tự (Character Encoding)

Hệ thống quy tắc xác định mối quan hệ tương ứng giữa ký tự và chuỗi bit. Gồm hai tầng: bộ ký tự (character set - xác định ký tự nào được hỗ trợ) và phương thức mã hóa (encoding scheme - cách chuyển đổi thành chuỗi byte).

Mã hóa ký tự (character encoding) là công nghệ nền tảng để máy tính xử lý văn bản. Nó định nghĩa quy tắc chuyển đổi các ký tự mà con người đọc được như "A" hay "ă" thành giá trị số mà máy tính có thể xử lý. Không có quy tắc chuyển đổi này, việc lưu trữ, truyền tải và hiển thị văn bản đều không thể thực hiện.

Mã hóa ký tự dễ hiểu nhất khi chia thành hai tầng. Tầng thứ nhất là "bộ ký tự" (character set), xác định những ký tự nào được hỗ trợ. ASCII bao gồm 128 ký tự, JIS X 0208 khoảng 6.879 ký tự, Unicode hơn 150.000 ký tự. Tầng thứ hai là "phương thức mã hóa" (encoding scheme), xác định cách biểu diễn mỗi ký tự trong bộ ký tự bằng chuỗi byte. Đây là lý do tại sao cùng một bộ ký tự Unicode lại có các phương thức mã hóa khác nhau như UTF-8, UTF-16 và UTF-32.

Lịch sử mã hóa ký tự tiếng Nhật khá phức tạp. Năm 1978, JIS C 6226 (sau đổi thành JIS X 0208) được ban hành, từ đó sinh ra Shift_JIS (Microsoft thiết kế cho PC), EUC-JP (phổ biến trên hệ thống UNIX) và ISO-2022-JP (dùng cho email). Ba phương thức mã hóa biểu diễn cùng một bộ ký tự bằng các chuỗi byte khác nhau, dẫn đến lỗi hiển thị ký tự (mojibake) thường xuyên khi chuyển đổi qua lại. Tiếng Việt cũng từng trải qua tình trạng tương tự với các bảng mã TCVN 3, VNI và VISCII trước khi Unicode thống nhất.

Hiện nay, xu hướng thống nhất sang Unicode + UTF-8 đang diễn ra mạnh mẽ. UTF-8 có khả năng tương thích ngược hoàn toàn với ASCII, biểu diễn văn bản tiếng Anh bằng 1 byte/ký tự, tiếng Nhật 3 byte/ký tự, và tiếng Việt (có dấu) cũng 2-3 byte/ký tự. Thiết kế độ dài biến đổi này cho phép xử lý mọi ngôn ngữ trên thế giới trong khi vẫn giữ tương thích với hệ thống ASCII. UTF-8 đã được chọn làm mã hóa mặc định cho web, cơ sở dữ liệu và ngôn ngữ lập trình, hầu như không còn lý do để chọn mã hóa khác cho dự án mới.

Hiểu biết về mã hóa ký tự là bắt buộc khi đếm ký tự. Cùng một chữ "ă" nhưng số byte khác nhau tùy mã hóa. "Số ký tự" và "số byte" chỉ trùng nhau trong phạm vi ASCII; với văn bản tiếng Việt hay tiếng Nhật, hai giá trị này luôn khác nhau. VARCHAR(255) trong cơ sở dữ liệu là "255 ký tự" hay "255 byte" phụ thuộc vào cài đặt mã hóa, nếu không nắm rõ đặc tả thì dữ liệu có thể bị cắt ngắn.

Về mặt thực tế, khi kết nối với hệ thống cũ vẫn có thể cần chuyển đổi sang Shift_JIS hoặc EUC-JP. Khi đó, các ký tự có trong Unicode nhưng không có trong Shift_JIS (ví dụ: một số emoji, kanji mở rộng CJK) sẽ không thể chuyển đổi và bị thay thế bằng "?" hoặc "〓". Cần nhận thức rằng chuyển đổi mã hóa ký tự là thao tác có thể gây mất thông tin và không thể đảo ngược.

Chia sẻ bài viết này