Mã hóa độ dài biến đổi (Variable-Length Encoding)
Phương thức mã hóa trong đó số byte sử dụng khác nhau tùy theo ký tự. UTF-8 (1-4 byte) và Shift_JIS (1-2 byte) là các ví dụ tiêu biểu, tăng hiệu quả bằng cách biểu diễn ký tự thường dùng bằng chuỗi byte ngắn hơn.
Mã hóa độ dài biến đổi (variable-length encoding) là phương thức mã hóa không biểu diễn tất cả ký tự bằng cùng số byte, mà gán số byte khác nhau cho mỗi ký tự. Đối lập với nó là mã hóa độ dài cố định, với UTF-32 (mọi ký tự đều 4 byte) và ASCII (mọi ký tự đều 1 byte) là các ví dụ.
Ưu điểm lớn nhất của mã hóa độ dài biến đổi là hiệu quả không gian. Trong UTF-8, ký tự ASCII (chữ-số, ký hiệu) được biểu diễn bằng 1 byte, kanji và hiragana tiếng Nhật bằng 3 byte, ký tự tiếng Việt có dấu bằng 2-3 byte, và một số emoji bằng 4 byte. Trên web nơi văn bản tiếng Anh chiếm đa số, so với UTF-32 có thể giảm 75% dung lượng dữ liệu. Ngay cả với văn bản tiếng Nhật, UTF-8 chỉ cần 3 byte/ký tự so với 4 byte/ký tự của UTF-32, tiết kiệm 25%.
Thiết kế độ dài biến đổi của UTF-8 rất tinh vi. Chỉ cần nhìn mẫu bit của byte đầu tiên là biết ký tự đó gồm bao nhiêu byte. Ký tự 1 byte là 0xxxxxxx, 2 byte là 110xxxxx 10xxxxxx, 3 byte là 1110xxxx 10xxxxxx 10xxxxxx, 4 byte là 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx. Tính tự đồng bộ này cho phép phát hiện chính xác ranh giới ký tự ngay cả khi bắt đầu đọc từ giữa chuỗi byte.
Shift_JIS cũng là mã hóa độ dài biến đổi. Ký tự tương thích ASCII và katakana nửa chiều rộng dùng 1 byte, kanji và hiragana dùng 2 byte. Tuy nhiên, Shift_JIS không có tính tự đồng bộ như UTF-8, nên khi bắt đầu đọc từ giữa chuỗi byte có thể nhầm lẫn byte thứ nhất và byte thứ hai. Điểm yếu thiết kế này khiến xử lý văn bản Shift_JIS trở nên phức tạp.
Cạm bẫy lớn nhất của mã hóa độ dài biến đổi là "số ký tự" và "số byte" không trùng nhau. Trong UTF-8, "Hello" là 5 byte (5 ký tự), "こんにちは" là 15 byte (5 ký tự), "Xin chào" là 9 byte (8 ký tự bao gồm dấu cách). Để truy cập ký tự thứ n trong chuỗi, phải đếm byte từ đầu, không thể dùng phép nhân đơn giản như mã hóa độ dài cố định. Điều này ảnh hưởng đến hiệu suất thao tác chuỗi trong ngôn ngữ lập trình.
Khi thiết kế dung lượng cơ sở dữ liệu và hệ thống tệp, cần hiểu đúng đặc tính của mã hóa độ dài biến đổi. VARCHAR(255) trong MySQL với UTF-8 (utf8mb4) cho phép tối đa 255 ký tự, nhưng số byte tối đa là 1.020 byte (255 x 4). Khi ước tính dung lượng lưu trữ, phải tính theo byte chứ không phải ký tự, nếu không sẽ sai lệch so với thực tế.