Xin cho biết Windows quản lý việc lưu và hiển thị các ký tự của các ngôn ngữ khác nhau như thế nào?

Xin cho biết Windows quản lý việc lưu và hiển thị các ký tự của các ngôn ngữ khác nhau như thế nào? Khác nhau thế nào giữa Code page 1258 (tiếng Việt) và UTF-8, Unicode và Double byte.
nguyen tuan anh
nguyen tuan anh
Trả lời 15 năm trước
Tập ký tự là danh sách n ký tự rời rạc. Ta thường nói tập ký tự của 1 ngôn ngữ, của 1 vùng/miền nào đó. Để máy tính có thể xử lý được tập ký tự nào đó, trước hết cần mã hóa tập ký tự thành mã nhị phân mà máy tính hiểu được. Cách mã hóa thông dụng nhất là dùng n bit cố định để miêu tả từng ký tự của tập ký tự, thí dụ mã ASCII (American Standard Code for Interchange of Information) dùng 7 bit để miêu tả 1 ký tự, do đó mã ASCII chỉ có thể mã hóa 128 ký tự khác nhau. Mã ANSI (codepage 1252) dùng 8 bit để miêu tả từng ký tự, do đó mã ANSI có thể mã hóa được 256 ký tự khác nhau. Mã Unicode, theo lý thuyết, dùng 4 byte để miêu tả từng ký tự, do đó mã Unicode có thể miêu tả 4 tỉ ký tự khác nhau, 1 con số đủ lớn để miêu tả mọi ký tự của mọi ngôn ngữ từ quá khứ đến hiện tại và cả trong tương lai. Tuy nhiên 1 số platform (Windows) chỉ dùng 2 byte để miêu tả 1 ký tự Unicode, do đó chỉ có thể miêu tả 65536 ký tự khác nhau. Cũng giống như mã ANSI, mã Codepage 1258 là do Microsoft xây dựng để miêu tả tập ký tự tiếng Việt, ý tưởng chính của mã Codepage 1258 là dùng 1 byte miêu tả từng ký tự phụ âm, từng nguyên âm không dấu và từng dấu, còn ký tự có dấu được tạo thành bởi 2 byte: 1byte miêu tả nguyên âm và 1 byte miêu tả dấu. Ý tưởng này khá giống với nhiều bộ mã tiếng Việt 2 byte trước đây như VNI 2 byte, Bách Khoa 2 byte, Vietware 2 byte,... Để hiểu rõ ràng và cụ thể 1 bộ mã nào đó, bạn cần tìm bảng đặc tả của bộ mã đó (trên Internet), bảng đặc tả sẽ miêu tả rõ ràng từng giá trị mã miêu tả ký tự nào. Riêng với bộ mã Unicode, nếu dùng cố định 2 byte (hay 4 byte) để miêu tả từng ký tự thì rất lãng phí trong trường hợp văn bản cần mã hóa chỉ chứa các ký tự có mã rất nhỏ (thí dụ nhỏ hơn 256), Các ngôn ngữ dùng tập ký tự la tinh (trong đó có Việt Nam) rơi vào trường hợp này. Để tiết kiệm không gian nhớ chứa văn bản Unicode, người ta đã đưa ra nhiều cách chứa văn bản Unicode trong bộ nhớ máy tính, thí dụ như UTF-8, UTF-16... Như vậy, khác với ASCII, ANSI hay Unicode, các thuật ngữ UTF-8, UTF-16 không phải là bảng mã, chúng chỉ là những phương pháp chứa văn bản Unicode trong bộ nhớ để tiết kiệm bộ nhớ hơn (và quan trọng để tương thích với các ứng dụng cũ vốn chỉ làm việc trên bộ mã ASCII), Windows là HĐH toàn cầu hóa, nghĩa là nó có thể hoạt động trên bất kỳ tập ký tự nào (tức ngôn ngữ nào), tuy nhiên trước khi Windows có thể hoạt động trên 1 ngôn ngữ cụ thể, người dùng phải địa phương hóa nó. Thao tác địa phương hóa Windows diễn ra tại thời điểm cài đặt Windows vào máy hay tại thời điểm cấu hình lại windows sau đó (vào Control Panel, chạy icon Regional and Language Options). Về mặt lập trình, mỗi hàm API Windows thực hiện một chức năng nào đó, mà cần ít nhất 1 tham số chuỗi văn bản đều được Windows cung cấp 2 biến thể: 1 dùng chuỗi ANSI và 1 dùng chuỗi Unicode. Biến thể của hàm dùng tham số chuỗi Unicode có thể xử lý mọi ngôn ngữ khác nhau. Thí dụ hàm TextOutA(...) xuất chuỗi ANSI lên màn hình còn hàm TextOutW(...) xuất chuỗi Unicode lên màn hình. Windows dùng cách miêu tả UCS-2 để tả chuỗi Unicode, cách này dùng đúng 2 byte để miêu tả bất kỳ ký tự nào, do đó nhiều người còn gọi là double byte.