ASCII và Unicode: là gì và dùng để làm gì

Máy tính chỉ hiểu các con số, nên mỗi chữ cái bạn thấy trên màn hình đều là một mã. ASCII là bảng mã đầu tiên trở thành tiêu chuẩn và Unicode là bảng mã chúng ta dùng ngày nay để viết bằng mọi ngôn ngữ. Ở đây bạn sẽ thấy chúng hoạt động thế nào, nên biết những mã nào, vì sao đôi khi xuất hiện ký tự lạ thay cho dấu và cách tra cứu mọi thứ trong bảng.

Cập nhật:

Bảng mã ký tự là gì

Bảng mã là một sự thỏa thuận: «số 65 nghĩa là chữ A». Khi bạn viết một văn bản, chương trình lưu các con số đó; khi người khác mở nó ra, chương trình của họ dịch chúng lại thành chữ theo cùng thỏa thuận. Nếu hai bên không dùng cùng một bảng, văn bản sẽ hiển thị sai.

Cần tách hai ý. Một là bộ ký tự, danh sách cho biết số nào ứng với ký hiệu nào. Hai là cách những con số đó được lưu thành byte. Với ASCII hai ý này trùng nhau một cách đơn giản; với Unicode thì không, và đó là chỗ UTF-8 xuất hiện.

ASCII: 128 ký tự 7 bit

ASCII (viết tắt của American Standard Code for Information Interchange) được chuẩn hóa vào thập niên 1960. Nó dùng 7 bit, tức 2 mũ 7 = 128 mã, từ 0 đến 127. Trong đó có 33 ký tự điều khiển (từ 0 đến 31 và 127) và 95 ký tự in được (từ 32 đến 126, kể cả dấu cách).

Nó không có chữ có dấu, không có chữ ñ, cũng không có ký hiệu euro: nó được thiết kế cho tiếng Anh. Điều đó giải thích vì sao sau này cần đến các bảng mã khác.

Các mã bạn sẽ gặp nhiều nhất. Dấu cách (32) được tính là ký tự in được dù không nhìn thấy.
Ký tự điều khiểnThập phânThập lục phânNhị phân (7 bit)Dùng để làm gì
Ký tự rỗng (NUL)0000000000Đánh dấu kết thúc một chuỗi trong nhiều ngôn ngữ
Tab ngang (TAB)9090001001Nhảy đến điểm dừng tab kế tiếp
Xuống dòng (LF)100A0001010Xuống dòng kế tiếp
Về đầu dòng (CR)130D0001101Quay về đầu dòng
Thoát (ESC)271B0011011Bắt đầu các chuỗi điều khiển
Dấu cách32200100000Ký tự in được đầu tiên
Xóa (DEL)1277F1111111Xóa ký tự

Những quy luật nên nhớ

Bảng này không được sắp xếp ngẫu nhiên. Với vài quy luật, bạn có thể đọc mã từ trí nhớ.

Kết thúc dòng: LF, CR và CRLF

Một lần xuống dòng nghe đơn giản, nhưng cách viết khác nhau tùy hệ thống. Unix, Linux và macOS dùng một ký tự duy nhất, LF (10). Windows dùng hai ký tự liền nhau, CR và LF (13 và 10), gọi là CRLF. Các máy điện báo cũ cần hai lệnh riêng: đưa đầu in về đầu dòng và cuộn giấy lên một dòng.

Sự khác biệt đó là nguyên nhân khiến có những file hiện toàn bộ trên một dòng trong một trình soạn thảo đơn giản, hoặc có một ký hiệu lạ ở cuối mỗi dòng. Nếu bạn muốn biết mã của từng loại, hãy gõ LF hoặc CR vào ô tìm kiếm của bảng ASCII.

«ASCII mở rộng» không phải là một tiêu chuẩn

Vì một byte có 8 bit mà ASCII chỉ dùng 7, còn dư 128 mã trống (từ 128 đến 255) và mỗi nhà sản xuất, mỗi khu vực lấp chúng theo cách riêng. Điều đó được gọi là «ASCII mở rộng», nhưng không có một bảng duy nhất: có rất nhiều bảng, gọi là bảng mã trang (code page). Hai bảng nổi tiếng nhất là Latin-1 (ISO-8859-1), trong đó chữ é là mã 233, và Windows-1252, tương tự nhưng khác ở các mã 128 đến 159 (chẳng hạn ở đó có ký hiệu euro).

Vấn đề là mã 233 nghĩa là «é» trong bảng này và là thứ khác trong bảng kia. Một văn bản viết bằng bảng này và đọc bằng bảng khác sẽ hiện ra rác. Unicode ra đời để chấm dứt sự lộn xộn đó.

Unicode và UTF-8

Unicode gán một con số duy nhất, gọi là điểm mã (code point), cho mỗi ký tự của gần như mọi hệ chữ viết trên thế giới, cùng với ký hiệu và emoji. Ngày nay nó có hơn 150.000 ký tự. Nó được viết với tiền tố U+ và ở dạng thập lục phân: «A» là U+0041, «ñ» là U+00F1, euro là U+20AC và emoji mặt cười là U+1F600. 128 điểm mã đầu tiên chính xác là của ASCII.

UTF-8 là cách được dùng nhiều nhất để lưu các con số đó thành byte, và dùng từ 1 đến 4 byte tùy ký tự. 128 ký tự của ASCII chiếm một byte duy nhất giống hệt như trước, nên một văn bản ASCII cũng là một văn bản UTF-8 hợp lệ. Phần còn lại chiếm nhiều byte hơn.

Càng xa ASCII, ký tự càng chiếm nhiều byte.
Ký tựĐiểm mãSố byte trong UTF-8Byte (thập lục phân)
AU+0041141
éU+00E92C3 A9
ñU+00F12C3 B1
€U+20AC3E2 82 AC
😀U+1F6004F0 9F 98 80

Vì sao hiện «Ã±» thay cho «ñ»

Đây là lỗi phổ biến nhất và có lời giải thích chính xác. Chữ ñ trong UTF-8 là hai byte: C3 và B1. Nếu một chương trình tưởng văn bản ở dạng Latin-1, nó đọc mỗi byte như một ký tự: C3 là «Ã» và B1 là «±». Kết quả: «Ã±». Điều tương tự xảy ra với «é», hiện thành «Ã©», và với tiếng Việt, nơi «ế» chiếm ba byte và hiện thành «áº¿», còn «tiếng Việt» trở thành chuỗi khó đọc.

Cách khắc phục hầu như luôn là cho chương trình biết hãy mở file ở dạng UTF-8 (trong một trình soạn thảo văn bản hoặc trong phần cài đặt nhập dữ liệu của bảng tính). Khi xảy ra ngược lại, văn bản Latin-1 bị đọc như UTF-8, thường xuất hiện các hình thoi có dấu hỏi, vì những byte rời đó không tạo thành chuỗi UTF-8 hợp lệ.

Cách dùng bảng ASCII và công cụ chuyển đổi

Công cụ «Bảng mã ASCII» hiển thị 128 ký tự cùng mã ở dạng thập phân, thập lục phân, bát phân và nhị phân, và tên của các ký tự điều khiển.

  1. Gõ vào ô tìm kiếm một ký tự, một mã hoặc tên của một ký tự điều khiển (ví dụ A, 65, 41 hoặc LF) để tìm hàng của nó.
  2. Dùng các nút lọc (Điều khiển, Chữ số, Chữ hoa, Chữ thường, Dấu) để chỉ xem một nhóm.
  3. Để chuyển đổi, gõ một văn bản vào «Văn bản» và chọn «Định dạng của mã» (thập phân, thập lục phân, bát phân hoặc nhị phân): các mã hiện ra bên dưới. «Hola» cho ra 72 111 108 97 trong thập phân và 48 6F 6C 61 trong thập lục phân.
  4. Bạn cũng có thể làm ngược lại: dán các mã cách nhau bằng dấu cách hoặc dấu phẩy vào «Mã» và văn bản sẽ được tạo ra. Với thập lục phân, các tiền tố như 0x41 được chấp nhận.

Nếu văn bản có ký tự không thuộc ASCII, như ñ hay chữ tiếng Việt có dấu, công cụ sẽ báo và hiển thị mã Unicode của nó. Để xem các byte thật trong UTF-8, hãy dùng «Chuyển văn bản sang nhị phân»: chữ ñ cho ra 11000011 10110001, hai byte 8 bit. Các giới hạn: bảng chỉ hiển thị ASCII chuẩn, không phải ASCII mở rộng, và mọi thứ được tính trong trình duyệt của bạn mà không gửi văn bản đến máy chủ nào.

Câu hỏi thường gặp

ASCII có bao nhiêu ký tự?

128, với các mã từ 0 đến 127 và mỗi mã 7 bit. Trong đó 33 là ký tự điều khiển và 95 là ký tự in được, tính cả dấu cách.

Mã ASCII của chữ A và chữ a là bao nhiêu?

«A» là 65 (41 trong thập lục phân, 01000001 trong nhị phân) và «a» là 97 (61 trong thập lục phân, 01100001 trong nhị phân). Chúng luôn chênh nhau 32.

ASCII và Unicode khác nhau thế nào?

ASCII có 128 ký tự dành cho tiếng Anh. Unicode có hơn 150.000, của gần như mọi ngôn ngữ và cả emoji, và 128 ký tự đầu tiên của nó giống hệt ASCII.

UTF-8 là gì?

Là cách được dùng nhiều nhất để lưu văn bản Unicode thành byte. Nó dùng từ 1 đến 4 byte cho mỗi ký tự: ký tự ASCII chiếm một, chữ ñ chiếm hai và emoji chiếm bốn.

Vì sao văn bản của tôi hiện «Ã±» hoặc «Ã©»?

Vì một văn bản lưu ở dạng UTF-8 đang bị đọc như Latin-1. Hãy mở file và chỉ định bảng mã UTF-8 là sẽ hết lỗi.