Bảng ASCII: cách 128 con số trở thành nền tảng của văn bản
ASCII, viết tắt của American Standard Code for Information Interchange (Mã trao đổi thông tin tiêu chuẩn Mỹ), là bảng mã hóa dạy các máy tính đồng ý với nhau về ý nghĩa của một chữ cái. Được công bố năm 1963 và hoàn thiện trong suốt thập niên 1960, nó ánh xạ mỗi ký tự cơ bản của văn bản tiếng Anh, các chữ số và một số tín hiệu điều khiển sang các con số mà máy có thể lưu trữ và truyền tải. Khi bạn nhấn phím chữ A hoa, máy tính không lưu một hình dạng, nó lưu con số 65. ASCII là bảng tra cứu khiến con số đó có nghĩa là A ở bất cứ nơi nào nó đi đến.
Tiêu chuẩn này nổi tiếng về tính gọn nhẹ. ASCII là mã 7 bit, nghĩa là mỗi ký tự vừa trong bảy chữ số nhị phân và toàn bộ kho ký tự trải dài đúng 2 lũy thừa 7, tức là 128 điểm mã riêng biệt được đánh số từ 0 đến 127. Sự tiết kiệm đó là có chủ đích. Máy teletype và modem thời kỳ đầu chậm và đắt tiền, nên mỗi bit đều có giá trị. Bảy bit đủ để bao gồm các chữ cái Latin hoa và thường, mười chữ số, dấu câu thông dụng, và các ký tự tín hiệu giúp các thiết bị đồng bộ với nhau, với một bit còn lại mà nhiều hệ thống dùng để kiểm tra lỗi.

Hai nửa: ký tự điều khiển và ký tự in được
Bảng chia rõ ràng thành hai vùng. Mã từ 0 đến 31, cộng với mã 127 (DEL), là các ký tự điều khiển. Chúng không in ra ký hiệu trên màn hình. Thay vào đó, chúng hướng dẫn một thiết bị làm gì đó: mã 9 là tab ngang, mã 10 là xuống dòng (line feed) chuyển sang dòng mới, mã 13 là về đầu dòng (carriage return), và mã 7 là tiếng chuông từng làm terminal phát ra âm thanh. Tổng cộng có 33 mã tín hiệu như vậy, và mặc dù nhiều cái giờ chỉ còn là tò mò lịch sử, xuống dòng, về đầu dòng và tab vẫn là thiết yếu cho cách định dạng tệp văn bản ngày nay.
Mã từ 32 đến 126 là các ký tự in được, tổng cộng 95 ký tự. Mã 32 là dấu cách, được tính là in được vì nó di chuyển con trỏ dù không hiển thị gì. Từ đó bạn có dấu câu và ký hiệu, các chữ số 0 đến 9 ở mã 48 đến 57, các chữ cái hoa A đến Z ở mã 65 đến 90, và các chữ cái thường a đến z ở mã 97 đến 122. Một tính chất gọn gàng nảy sinh từ cách bố trí này: phiên bản thường và hoa của cùng một chữ cái chênh nhau đúng 32, đó là lý do tại sao việc đảo một bit duy nhất chuyển đổi chữ hoa/thường. Những quy luật này không phải ngẫu nhiên, chúng được thiết kế có chủ đích để sắp xếp và chuyển đổi chữ hoa/thường có thể thực hiện bằng phép toán đơn giản.
Thập phân, thập lục phân và nhị phân: ba cách nhìn về một con số
Mỗi mã ASCII chỉ là một con số, và bạn sẽ thấy nó được viết theo ba cách. Thập phân là dạng cơ số 10 thông thường, nên A là 65. Thập lục phân, cơ số 16, là dạng lập trình viên thường dùng vì nó căn chỉnh với byte: A là 0x41, và phạm vi in được chạy từ 0x20 đến 0x7E. Nhị phân, cơ số 2, là dạng phần cứng thực sự lưu trữ, nên A là 1000001 qua bảy bit của nó. Cùng một ký tự, ba ký hiệu khác nhau, và thành thạo trong việc chuyển đổi giữa chúng là kỹ năng cốt lõi khi bạn đọc dump bộ nhớ hoặc lưu lượng mạng. Nếu bạn thường xuyên làm việc với các phép chuyển đổi này, bộ bảng tham chiếu trên speedor.net giữ các ánh xạ chỉ một cú nhấp chuột.

ASCII vẫn quan trọng ở đâu
Sẽ là sai lầm nếu xếp ASCII vào lịch sử. Nó vẫn sống động trong công việc hàng ngày của bất kỳ ai làm việc với code. Các ngôn ngữ lập trình xử lý chuỗi ký tự, tệp nguồn và các từ khóa giao thức là ASCII ở cấp độ byte. Các giao thức mạng như header HTTP, SMTP và nhiều định dạng cấu hình được định nghĩa trong ASCII để chúng vẫn đọc được bởi con người. Khi một chuỗi trông bị hỏng, các lập trình viên dùng trình xem hex và đọc các byte thô so với bảng ASCII để phát hiện ký tự điều khiển lạ hoặc kết thúc dòng sai. URL encoding, Base64 và các chuỗi escape đều dựa trên giá trị ASCII. Với bất kỳ ai gỡ lỗi encoding, một tham chiếu nhanh bên cạnh công cụ lập trình viên của bạn biến một byte bí ẩn thành câu trả lời rõ ràng.
Từ ASCII đến Unicode và UTF-8
ASCII xử lý tiếng Anh tuyệt vời và hầu như không còn gì khác. Giới hạn 128 ký tự không thể chứa chữ cái có dấu, Cyrillic, Trung Quốc, Ả Rập hay emoji. Unicode trả lời điều đó bằng cách gán một con số duy nhất, gọi là code point, cho mỗi ký tự trong mọi hệ thống chữ viết, giờ đây có hơn một trăm nghìn ký tự. Đặc biệt, Unicode là một danh mục ký tự, không phải định dạng lưu trữ, vì vậy nó cần một bảng mã hóa để biến các code point đó thành byte.
UTF-8 là bảng mã hóa đó, và đây là lý do ASCII không thực sự biến mất. UTF-8 dùng một đến bốn byte mỗi ký tự, và nó được thiết kế để các code point từ 0 đến 127, toàn bộ phạm vi ASCII, được lưu trữ trong một byte duy nhất giống hệt ASCII thuần. Điều này làm cho UTF-8 hoàn toàn tương thích ngược: mọi tệp ASCII hợp lệ đều đã là tệp UTF-8 hợp lệ. Các ký tự trên 127 dùng các byte bổ sung. Khả năng tương thích thanh lịch này là lý do lớn tại sao UTF-8 hiện chiếm phần lớn web. Tóm lại, ASCII là lõi 128 ký tự ban đầu, Unicode là danh mục phổ quát chứa nó, và UTF-8 là bảng mã hóa mang cả hai trong khi giữ nguyên văn bản ASCII từng byte.
Các câu hỏi thường gặp
Bảng ASCII có bao nhiêu ký tự?
ASCII tiêu chuẩn định nghĩa 128 ký tự, được đánh số từ 0 đến 127. Trong đó, 95 ký tự in được bao gồm dấu cách, và 33 là ký tự điều khiển phát tín hiệu cho thiết bị thay vì in ra ký hiệu.
Sự khác biệt giữa ký tự điều khiển và ký tự in được là gì?
Ký tự điều khiển, mã 0 đến 31 cộng 127, hướng dẫn thiết bị làm gì đó như xuống dòng hoặc tab và không tạo ra ký hiệu hiển thị. Ký tự in được, mã 32 đến 126, là các chữ cái, chữ số, dấu câu và dấu cách bạn thực sự thấy trên màn hình.
Tại sao ASCII là mã 7 bit?
Bảy bit cho đúng 128 tổ hợp, đủ để bao gồm các chữ cái tiếng Anh, chữ số, dấu câu và tín hiệu điều khiển trong khi tiết kiệm băng thông trên phần cứng thời kỳ đầu chậm. Bit thứ tám trong một byte thường được dành cho kiểm tra lỗi parity.
Mã ASCII của chữ A là gì?
Chữ A hoa là thập phân 65, thập lục phân 0x41, và nhị phân 1000001. Chữ a thường là thập phân 97, cao hơn đúng 32, một mẫu tích hợp cho phép chuyển đổi chữ hoa/thường bằng phép toán đơn giản.
ASCII có giống Unicode không?
Không. ASCII bao gồm 128 ký tự, trong khi Unicode lập danh mục hơn một trăm nghìn ký tự trên mọi hệ thống chữ viết. ASCII thực chất là 128 code point đầu tiên của Unicode, vì vậy nó là một tập con nhỏ của tiêu chuẩn lớn hơn.
UTF-8 liên quan đến ASCII như thế nào?
UTF-8 là bảng mã hóa cho Unicode, lưu các code point từ 0 đến 127 trong một byte duy nhất giống hệt ASCII. Điều này làm cho mọi tệp ASCII đều là tệp UTF-8 hợp lệ, đó là lý do tại sao UTF-8 tương thích ngược và thống trị web hiện đại.
