Bảng ASCII
Tham khảo đầy đủ 128 ký tự ASCII với mã thập phân, thập lục phân, bát phân và nhị phân.
128 ký tự được hiển thị
Về ASCII
ASCII (American Standard Code for Information Interchange) là một tiêu chuẩn mã hóa ký tự 7 bit định nghĩa 128 ký tự. Được công bố lần đầu tiên vào năm 1963, nó là cơ sở của hầu hết các mã hóa ký tự hiện đại, bao gồm UTF-8.
Phạm vi ký tự
- 0–31 · Ký tự điều khiển (không thể in)
- 32 · Khoảng trắng
- 33–47 · Dấu câu & biểu tượng
- 48–57 · Chữ số 0–9
- 65–90 · Chữ hoa A–Z
- 97–122 · Chữ thường a–z
- 127 · DEL (xóa)
Sự khác biệt giữa ASCII và Unicode là gì?
ASCII định nghĩa 128 ký tự trên 7 bit. Unicode là một siêu tập hợp bao gồm hơn 149.000 ký tự từ tất cả các hệ thống chữ viết. 128 điểm mã Unicode đầu tiên giống với ASCII.
Cách sử dụng các mã này trong lập trình?
Trong JavaScript: String.fromCharCode(65) → «A». Trong Python: chr(65). Trong C: (char)65. Các giá trị thập lục phân hoạt động với chuỗi escape: \x41 = «A».
Cách Hoạt Động
- Duyệt bảng đầy đủ: tất cả 128 ký tự ASCII xuất hiện trong lưới được sắp xếp theo code point (0 đến 127). Mỗi ô hiển thị ký tự có thể nhìn thấy (hoặc tên viết tắt cho mã điều khiển), mã thập phân, và các giá trị tương đương theo hex / octal / nhị phân.
- Lọc theo danh mục: dùng dropdown để thu hẹp về ký tự điều khiển (0-31), ký tự có thể in (32-126), chữ cái, chữ số hoặc ký hiệu. Hữu ích khi bạn chỉ quan tâm đến, chẳng hạn, khối dấu câu.
- Tìm kiếm: ô tìm kiếm khớp theo tên ký tự («LF»), tên viết tắt, hoặc giá trị số (thập phân hay hex). Nhập
0x41,65, hoặcAđều nhảy đến cùng một ô. - Nhấp vào ô để sao chép bất kỳ biểu diễn nào vào clipboard. Tiện lợi khi bạn cần
\x1Bcho ANSI escape,0x0Acho ký tự xuống dòng Unix, hoặc số thập phân32cho dấu cách.
Lịch Sử Ngắn về ASCII
ASCII (American Standard Code for Information Interchange) được kỹ sư IBM Bob Bemer đề xuất lên tiểu ban X3.2 của Hiệp hội Tiêu chuẩn Mỹ vào tháng 5 năm 1961, với mục tiêu thay thế hàng chục bộ mã ký tự không tương thích đang được sử dụng lúc đó. Phiên bản xuất bản đầu tiên là ASA X3.4-1963; chữ thường không xuất hiện cho đến bản sửa đổi năm 1967. Tiêu chuẩn đã được tái xác nhận nhiều lần kể từ đó dưới tên ANSI X3.4-1986, và nó là nền tảng của mọi bộ mã ký tự hiện đại thông qua người anh em quốc tế của nó, ISO/IEC 646 (và ECMA-6 của châu Âu).
Để sử dụng trong mạng, ASCII được pháp điển hóa bởi RFC 20, «ASCII format for Network Interchange,» được xuất bản vào ngày 16 tháng 10 năm 1969 và được viết bởi Vint Cerf tại UCLA. Khuyến nghị của RFC («7-bit ASCII nhúng trong một byte 8-bit có bit bậc cao luôn là 0») vẫn là cách mọi ngôn ngữ lập trình và giao thức hiện đại hiểu về văn bản thuần túy. Chính phủ Mỹ, theo sắc lệnh hành pháp của Tổng thống Lyndon B. Johnson năm 1968, bắt buộc hỗ trợ ASCII trên tất cả máy tính liên bang từ ngày 1 tháng 7 năm 1969, điều này đảm bảo việc áp dụng trên toàn ngành.
Tại Sao Lại Là Bảy Bit?
Ủy ban X3.2 bị kẹt giữa hai lựa chọn kém hấp dẫn. Mã 6-bit (dùng bởi các bảng chữ cái điện báo cũ như ITA2) không đáng tin cậy: một bit bị lật trên đường truyền nhiễu có thể giải mã sai mọi ký tự tiếp theo nếu nó rơi vào bit shift. Mã 8-bit có vẻ lãng phí trong thời đại bộ nhớ đắt tiền và modem chậm. Sự thỏa hiệp là 7 bit = 128 code point, để lại bit thứ 8 dành cho parity. Đặt bit parity sao cho mỗi byte có tổng số bit 1 chẵn (hoặc lẻ) sẽ phát hiện 100% lỗi truyền đơn bit, chính xác là vấn đề mà các acoustic coupler và cáp serial những năm 1960 gây ra.
Khi tỷ lệ lỗi giảm và modem nhanh hơn, bit thứ 8 được tái sử dụng. Các code page «extended ASCII» quốc gia khác nhau (Latin-1, Windows-1252, Mac Roman, KOI8-R, …) dùng mã 128-255 cho chữ có dấu và ký tự vẽ khung, nhưng các ánh xạ đó không tương thích với nhau và cuối cùng bị thay thế bởi Unicode và UTF-8.
Cấu Trúc: 128 Code Point
7 bit = 27 = 128 mã khác nhau, được tổ chức thành 33 ký tự điều khiển (0-31 cộng DEL ở vị trí 127) và 95 ký tự có thể in (32-126):
| Phạm vi | Hex | Nội dung |
|---|---|---|
| 0-31 | 00-1F | Ký tự điều khiển (NUL, BEL, BS, HT, LF, CR, ESC, FS-US, …) |
| 32 | 20 | SPACE, có thể in nhưng vô hình |
| 33-47 | 21-2F | Dấu câu: ! " # $ % & ' ( ) * + , - . / |
| 48-57 | 30-39 | Chữ số 0-9 |
| 58-64 | 3A-40 | Thêm dấu câu: : ; < = > ? @ |
| 65-90 | 41-5A | Chữ hoa A-Z |
| 91-96 | 5B-60 | Dấu ngoặc và ký tự đặc biệt: [ \ ] ^ _ ` |
| 97-122 | 61-7A | Chữ thường a-z |
| 123-126 | 7B-7E | Dấu ngoặc nhọn và dấu ngã: { | } ~ |
| 127 | 7F | DEL, «rub out» trên băng giấy đục lỗ (nhị phân 1111111) |
Các Ký Tự Điều Khiển Vẫn Còn Quan Trọng
Hầu hết 33 ký tự điều khiển có nguồn gốc từ các lệnh máy teletype và băng giấy và nay là các điều tò mò lịch sử. Một số vẫn còn đóng vai trò quan trọng trong máy tính hàng ngày:
- NUL (0x00): kết thúc chuỗi trong C và bất kỳ ngôn ngữ nào dẫn xuất từ C. Dán một null nhúng vào đường dẫn file là cách kinh điển để làm crash code cũ.
- BEL (0x07,
\a): tiếng bíp của terminal. Vẫn được kích hoạt bởiprintf '\a'. - BS (0x08,
\b): backspace. Dùng bởi các thư viện progress-bar để ghi đè dòng trước. - HT (0x09,
\t): tab ngang. Định nghĩa ký tự tab dùng trong file TSV và cuộc tranh luận indentation vĩnh cửu của interpreter Python. - LF (0x0A,
\n): line feed. Ký tự xuống dòng Unix. - CR (0x0D,
\r): carriage return. Một nửa của ký tự xuống dòng Windows; dùng một mình cho «trở về đầu dòng» trong progress bar. - ESC (0x1B,
\e/\x1B): ký tự escape. Phát minh gốc của Bemer, hiện là tiền tố cho mọi chuỗi ANSI terminal escape (màu sắc, di chuyển con trỏ, xóa màn hình). - FS / GS / RS / US (0x1C-0x1F): phân cách File / Group / Record / Unit. Được thiết kế cho lưu trữ băng từ theo bản ghi trong những năm 1960 và phần lớn bị lãng quên, cho đến khi RFC 7464 «JSON Text Sequences» đưa RS trở lại làm tiền tố phân cách cho các bản ghi JSON streaming (
application/json-seq). GS vẫn xuất hiện trong một số giao thức mã vạch bán lẻ. - DEL (0x7F): «rub out.» Phím RUB OUT của Teletype Model 33 gửi mã 127 vì trong hệ nhị phân nó là
1111111: tất cả bảy bit đều được đặt. Để xóa một ký tự trên băng giấy đục lỗ, người vận hành lùi băng lại và nhấn RUB OUT, đục qua tất cả các lỗ hiện có. Máy nhận được cho là bỏ qua bất kỳ byte nào là tất-cả-1.
Cuộc Chiến Ký Tự Xuống Dòng
Ba nền tảng đã chọn ba quy ước khác nhau, và phần mềm đã phải trả giá cho điều đó kể từ đó. Nguồn gốc cơ học là máy đánh chữ và máy teletype, nơi cần hai thao tác riêng biệt: carriage return di chuyển đầu in về cột 1, và line feed đẩy giấy lên một dòng. Các hệ thống khác nhau đưa ra quyết định khác nhau về việc mã hóa điều này thành một byte hay hai:
| OS | Xuống dòng | Bytes | Escape |
|---|---|---|---|
| Unix / Linux / macOS hiện đại | LF | 0x0A | \n |
| Mac OS cổ điển (trước OS X) | CR | 0x0D | \r |
| Windows / DOS | CRLF | 0x0D 0x0A | \r\n |
Hầu hết giao thức Internet bắt buộc dùng CRLF: HTTP, SMTP, FTP, MIME, và Internet Message Format tiêu chuẩn đều chỉ định nó. RFC 5322 không mơ hồ: «CR and LF MUST only occur together as CRLF; they MUST NOT appear independently» trong phần thân thông điệp. Tuy nhiên trong mã nguồn, quy ước khác nhau theo nhóm, đó là lý do git đi kèm core.autocrlf: với true trên Windows, git check out file dưới dạng CRLF trong working tree nhưng lưu chúng dưới dạng LF trong repo, để cùng một file nguồn tạo ra cùng hash blob trên mọi nền tảng. Một entry .gitattributes như * text=auto là lựa chọn thay thế ở cấp dự án.
Chuỗi ANSI Escape để Tô Màu Terminal
Ký tự escape (ESC, 0x1B) là tiền tố cho các chuỗi ANSI escape tô màu đầu ra terminal. Tiêu chuẩn là ECMA-48 (1976), sau được phản ánh dưới dạng ANSI X3.64 và tích hợp vào ISO/IEC 6429. Cú pháp là ESC [ + tham số + một chữ cái cuối; phần ESC [ được gọi là Control Sequence Introducer (CSI) và được viết khác nhau là \e[, \x1b[, hoặc \033[ tùy ngôn ngữ. Các mã Select Graphic Rendition phổ biến:
0: đặt lại / bình thường ·1: đậm ·4: gạch chân ·7: video đảo ngược30-37: màu chữ (đen, đỏ, xanh lá, vàng, xanh dương, đỏ tím, lam, trắng)40-47: màu nền (cùng thứ tự)90-97/100-107: màu chữ sáng / màu nền sáng
Vì vậy printf '\033[1;31mERROR\033[0m' in «ERROR» màu đỏ đậm và đặt lại sau đó. Mọi terminal emulator hiện đại (và Windows Terminal kể từ năm 2019) đều hỗ trợ những mã này.
ASCII so với Unicode và UTF-8
ASCII định nghĩa 128 code point; Unicode 16.0 (phát hành năm 2024) bao gồm hơn 154.000. Cầu nối quan trọng là UTF-8, bộ mã hóa văn bản chiếm ưu thế trên web (được ~98% website sử dụng năm 2026): UTF-8 được thiết kế sao cho bất kỳ byte ASCII 7-bit nào (0x00-0x7F) đều mã hóa cùng ký tự như trước, với bit cao bằng 0. Hệ quả thực tế là mọi file ASCII hợp lệ đều là file UTF-8 hợp lệ, giống hệt nhau từng byte. Các code point trên 127 được mã hóa dưới dạng chuỗi đa byte (2 đến 4 byte) với bit cao được đặt trên mỗi byte, điều này đảm bảo các parser ASCII kế thừa không bao giờ nhầm chúng với ký tự ASCII.
ASCII trong Các Ngôn Ngữ Lập Trình Phổ Biến
| Ngôn ngữ | Mã → ký tự | Ký tự → mã |
|---|---|---|
| JavaScript | String.fromCharCode(65) | 'A'.charCodeAt(0) |
| Python | chr(65) | ord('A') |
| C / C++ | (char)65 | (int)'A' |
| Java | (char) 65 | (int) 'A' |
| Rust | char::from(65) | 'A' as u32 |
| Go | string(rune(65)) | int('A') |
| Bash / sh | printf '\x41' | printf '%d' "'A" |
| HTML | A hoặc A | - |
| Mã hóa URL | %41 = «A», %20 = dấu cách | - |
Mẹo Về Bit Case
Một thuộc tính nhỏ nhưng tinh tế của cấu trúc ASCII: một chữ hoa và chữ thường tương ứng chỉ khác nhau đúng một bit. A là 65 = 0100 0001; a là 97 = 0110 0001. Chỉ có bit 5 khác nhau. Điều đó biến phép so sánh không phân biệt chữ hoa/thường thành một phép toán bitwise duy nhất: x | 0x20 bắt buộc chữ thường, x & 0xDF bắt buộc chữ hoa, cả hai đều nhanh hơn tra bảng. Đây là một lựa chọn thiết kế có chủ đích trong bản sửa đổi năm 1967 và là một lý do khiến cấu trúc trông «ngẫu nhiên» ở một số chỗ: nó mã hóa các thuộc tính thân thiện với phần cứng, không chỉ thứ tự bảng chữ cái.
Các Lỗi Thường Gặp
- Nhầm lẫn chữ số 0 với ký tự điều khiển NUL. NUL là mã 0; ký tự «0» là mã 48. Hai cái không thể hoán đổi cho nhau trong bất kỳ ngôn ngữ lập trình nào.
- Giả định một byte là một ký tự. Điều này chỉ đúng với văn bản ASCII. Văn bản UTF-8 có ký tự có độ rộng thay đổi, vì vậy độ dài byte và số lượng ký tự có thể rất khác nhau đối với các chữ viết không phải Latin.
- Trộn lẫn ký tự xuống dòng trong cùng một file. Sự pha trộn CR / LF / CRLF trong cùng file làm rối nhiều parser và tạo ra các dòng trống ảo hoặc thiếu dòng mới tùy thuộc vào hệ điều hành mở nó.
- Lỗi off-by-one trong kết thúc chuỗi C. Quên rằng chuỗi cần thêm một byte cho NUL đứng cuối là lỗ hổng buffer-overflow gốc.
- «Extended ASCII» được cho là có thể di chuyển. Mã 128-255 có nghĩa các ký tự khác nhau dưới Latin-1, Windows-1252, KOI8-R, Mac Roman, v.v. UTF-8 là lựa chọn hiện đại an toàn duy nhất.
- ESC nhúng trong đầu vào không tin cậy. Nếu bạn ghi dữ liệu do người dùng cung cấp vào terminal mà không sanitize nó, kẻ tấn công có thể chèn các chuỗi ANSI escape thay đổi màu sắc, di chuyển con trỏ hoặc xóa màn hình, đôi khi che giấu nội dung độc hại.
Câu Hỏi Thường Gặp
Tại sao DEL có mã 127 thay vì 0?
Vì 127 trong hệ nhị phân là 1111111: tất cả bảy bit đều được đặt. Để xóa một ký tự trên băng giấy đục lỗ, người vận hành lùi băng lại và nhấn RUB OUT, đục qua tất cả các lỗ hiện có. Máy nhận được cho là bỏ qua bất kỳ byte nào là tất-cả-1, vì vậy ký tự «đã xóa» trở nên vô hình trong các lần đọc tiếp theo. Quy ước này được kế thừa từ các mã teletype trước đó.
«Extended ASCII» là gì và có an toàn khi sử dụng không?
ASCII tiêu chuẩn bao gồm code point 0-127 (7 bit). «Extended ASCII» đề cập một cách lỏng lẻo đến các bộ mã 8-bit lấp đầy code point 128-255 bằng các ký tự bổ sung, Latin-1, Windows-1252, KOI8-R, Mac Roman và nhiều bộ khác. Vấn đề là: các ký tự thêm có nghĩa khác nhau trong mỗi bộ mã. Tên này về mặt kỹ thuật là sự hiểu nhầm (những code page đó không phải là phần mở rộng của tiêu chuẩn ASCII), và chúng không an toàn giữa các hệ thống. UTF-8 là lựa chọn thay thế hiện đại, di chuyển được và tương thích ngược với phạm vi 0-127 gốc.
Tại sao space (32) được coi là «có thể in» nếu nó không hiển thị gì?
Vì nó chiếm không gian ngang trên dòng in, nó đẩy đầu in về phía trước đúng như một chữ cái. Ngược lại, ký tự điều khiển thay đổi trạng thái thiết bị mà không tạo ra đầu ra nhìn thấy được (BEL bíp, BS di chuyển đầu về phía sau, LF đẩy giấy). Phân loại dựa trên những gì ký tự làm trên máy in, không phải trên việc nó có glyph hay không.
CR và LF có giống với phím Enter trên bàn phím không?
Hầu hết là có, nhưng byte mà bàn phím của bạn tạo ra phụ thuộc vào hệ điều hành. Trên Windows, nhấn Enter thường tạo ra CRLF (0x0D 0x0A); trên Linux và macOS hiện đại, chỉ LF (0x0A); trên Mac OS cổ điển trước X, chỉ CR (0x0D). Nhiều trình soạn thảo chuẩn hóa điều này khi lưu dựa trên ký tự xuống dòng hiện có của file hoặc quy ước dự án được cấu hình.
Tại sao các ký tự phân cách file/group/record/unit lại có trong bảng?
Chúng được thiết kế cho lưu trữ băng từ theo bản ghi trong những năm 1960, File > Group > Record > Unit. Chúng phần lớn không còn được dùng, nhưng đã quay trở lại ở hai nơi bất ngờ: RFC 7464 «JSON Text Sequences» (loại media application/json-seq) dùng RS (0x1E) làm tiền tố phân cách các bản ghi JSON được stream, và ký tự phân cách GS1 Application Identifier trong các giao thức mã vạch bán lẻ dùng GS (0x1D).
ASCII có còn phù hợp vào năm 2026 không?
Rất có. Mọi giao thức hiện đại «dựa trên văn bản» (HTTP header, JSON, YAML, mã nguồn, đối số dòng lệnh, biến môi trường, hostname DNS) đều hoạt động trong phạm vi ASCII. UTF-8 là bộ mã hóa chiếm ưu thế cho văn bản tùy ý, nhưng 128 giá trị byte đầu tiên của UTF-8 chính xác là ASCII, từng byte một. Biết bảng này vẫn cần thiết cho mọi thứ từ mã hóa URL đến màu sắc terminal đến debug lỗi mã hóa văn bản.