Mục lục bài họcĐang ở d01-b3
Character sets, and why ASCII was not enough
A character set is an agreement
A computer stores only numbers, so text needs a table mapping each character to a code. ASCII uses $7$ bits, giving $128$ codes — enough for English letters, digits and punctuation. Extended ASCII uses $8$ bits for $256$.
Two facts about ASCII worth knowing
The codes are contiguous and ordered: 'A' is $65$, so 'C' is $67$; 'a' is $97$, exactly $32$ more than 'A'. That gap of $32$ is one bit, which is why changing case is a single bit operation. Digit '0' is $48$, so the character '7' minus $48$ gives the number $7$ — the standard way to convert a digit character to its value.
Why Unicode
$256$ codes cannot hold Vietnamese, Chinese, Arabic, Greek and emoji at the same time. Unicode gives every character in every writing system a unique code point. UTF-$8$ stores them in one to four bytes, and is designed so that the first $128$ code points are byte-identical to ASCII — old files still work.
The trade-off
Unicode text takes more storage than ASCII for the same message. That is the price of covering every language, and it is the comparison Cambridge asks for.
Bộ mã ký tự là một thoả thuận
Máy tính chỉ lưu được số, nên văn bản cần một bảng ánh xạ mỗi ký tự sang một mã. ASCII dùng $7$ bit, cho $128$ mã — đủ cho chữ cái tiếng Anh, chữ số và dấu câu. Extended ASCII dùng $8$ bit nên có $256$.
Hai điều về ASCII đáng nhớ
Các mã liền nhau và đúng thứ tự: 'A' là $65$ nên 'C' là $67$; 'a' là $97$, hơn 'A' đúng $32$. Khoảng cách $32$ đó chính là một bit, và đó là lý do đổi hoa–thường chỉ là một phép trên một bit. Chữ số '0' có mã $48$, nên ký tự '7' trừ $48$ ra số $7$ — đây là cách chuẩn để đổi một ký tự chữ số thành giá trị.
Vì sao cần Unicode
$256$ mã không thể chứa cùng lúc tiếng Việt, tiếng Trung, tiếng Ả Rập, tiếng Hy Lạp và emoji. Unicode cấp cho mọi ký tự của mọi hệ chữ viết một điểm mã riêng. UTF-$8$ lưu chúng bằng một tới bốn byte, và được thiết kế sao cho $128$ điểm mã đầu tiên trùng khít từng byte với ASCII — nhờ vậy file cũ vẫn đọc được.
Cái giá phải trả
Văn bản Unicode tốn nhiều dung lượng hơn ASCII cho cùng một nội dung. Đó là giá của việc bao phủ mọi ngôn ngữ, và cũng chính là phép so sánh Cambridge hay hỏi.
Biết mã ASCII của 'A' là $65$ và của 'a' là $97$.
(a) Tính mã của 'F' và của 'f'. (b) Viết một biểu thức đổi một chữ hoa bất kỳ thành chữ thường tương ứng. (c) Giải thích vì sao ASCII không đủ cho tiếng Việt.
(a) 'F' là chữ cái thứ sáu nên mã $= 65 + 5 = 70$. Chữ thường hơn chữ hoa đúng $32$, nên 'f' $= 70 + 32 = 102$.
(b) $\text{ma\_thuong} = \text{ma\_hoa} + 32$. Nói cách khác, đặt bit thứ sáu (giá trị $32$) lên $1$ — vì thế nhiều bộ xử lý đổi hoa–thường bằng một phép OR với $00100000$.
(c) Tiếng Việt cần các chữ có dấu như ă, ơ, ệ, ữ. Riêng bảng chữ cái tiếng Việt đã có $29$ chữ, cộng năm thanh điệu đặt trên nhiều nguyên âm khác nhau thì tổng số ký tự cần vượt xa khoảng trống còn lại trong $128$ mã của ASCII. Chưa kể nếu tài liệu còn có tiếng Trung hay emoji thì $256$ mã của Extended ASCII cũng không đủ. Unicode giải quyết bằng cách cấp điểm mã riêng cho từng ký tự của mọi hệ chữ viết.
Đọc xong rồi — làm thử ngay
Bài tập của chương Data Representation: Number Bases, Binary Arithmetic and Character Sets gồm 14 câu trắc nghiệm và 3 đề tự luận. Đáp án hiện ngay khi chọn, miễn phí.