Unicode và phát triển phần mềm
lượt xem 21
download
Trong lĩnh vực công nghệ thông tin, chúng ta đang chứng kiến bước chuyển của toàn thế giới: từ xử lý thông tin mang tính cục bộ của từng ngôn ngữ, văn hoá sang xử lý thông tin quy mô toàn cầu, bao quát tất cả các ngôn ngữ và văn hoá trên thế giới. Bước chuyển lớn lao này đòi hỏi chúng ta không chỉ phải làm quen với những sản phẩm mới, công nghệ mới mà CNTT đem lại. Điều quan trọng hơn cả là cần sự chuyển đổi lớn lao trong tư duy, trong cách nghĩ và...
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Unicode và phát triển phần mềm
- Unicode và phát triển phần mềm Ngô Trung Việt Viện Công nghệ Thông tin vietnt@altavista.net 1. Từ bộ mã ASCII tới bộ ký tự đa ngữ quốc tế Unicode Trong lĩnh v ực công nghệ thông tin, chúng ta đang chứng kiến bước chuyển c ủa toàn thế giới: từ xử lý thông tin mang tính c ục bộ c ủa từng ngôn ngữ, v ăn hoá sang xử lý thông tin quy mô toàn cầu, bao quát tất c ả c ác ngôn ngữ v à v ăn hoá trên thế giới. Bước chuyển lớn lao này đòi hỏi chúng ta không chỉ phải làm quen v ới những sản phẩm mới, công nghệ mới mà CNTT đem lại. Điều quan trọng hơn cả là c ần sự c huyển đổi lớn lao trong tư duy, trong cách nghĩ v à cách làm việc v ới máy tính c ủa từng người. Bước chuyển đầu tiên chính là từ v iệc chuyển đổi cách nghĩ, cách quan niệm và làm việc v ới cách mã hoá ngôn ngữ trong máy tính. Chúng ta đã quá quen thuộc v ới bộ mã ASCII, v ốn là c ơ sở được dùng trong các máy vi tính từ khi chúng xuất hiện trên thị trường, những năm 1980. Nhưng đến thiên niên kỷ mới, sự phát triển c ủa Internet và xu hướng toàn cầu hoá đã dứt khoát đòi hỏi cần có bộ ký tự đa ngữ quốc tế được mã hoá trong máy tính, nhằm giúp con người thuộc bất kỳ quốc gia nào c ũng có thể trao đổi thông tin với nhau qua máy tính và mạng máy tính. Một yêu c ầu rất lớn đòi hỏi những người làm ph ần mềm phải đáp ứng là chuyển đổi tư duy và cách làm việc để có thể tạo ra được những sản phẩm thực sự đáp ứng cho yêu c ầu toàn c ầu hoá, quốc tế hoá. Trước khi đi vào những điểm chính mà người làm ph ần mềm c ần lưu ý, chúng ta xem xét lại cách suy nghĩ quen thuộc v ề bộ mã ký tự ASCII để từ đó dịch chuyển dần sang quan niệm mới v ề bộ mã ký tự quốc tế đa ngữ Unicode. 1.1 Đặc điểm của bộ m ã ASCII Từ trước tới nay, cách tiếp cận bộ mã ASCII quen thuộc là cách tiếp cận của người làm phần mềm, người lập trình cho máy tính. Mối quan tâm đầu tiên c ủa người làm chương trình là biểu diễn các ký tự qua các con số trong máy tính. Hơn nữa, vì máy tính được phát triển đầu tiên ở Mỹ v à châu Âu nên bộ ký tự đầu tiên được đưa vào mã hoá trong máy tính là chữ tiếng Anh cùng các chữ số, các dấu ngắt câu, các ký hiệu thông thường và ký hiệu điều khiển. Với tập ký tự này, chỉ cần 7 bit là đ ủ mã hoá như trong bảng mã ASCII sau: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0 0 NUL SOH STX ETX EOT ENQ ACK BEL BS TAB L F VT FF CR SO SI 1 0 DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US 20 ! " # $ % & ' ( ) * + , - . / 30 0 1 2 3 4 5 6 7 8 9 : ; ? 40 @ A B C D E F G H I J K LM N O 50 P Q R S T U V W X Y Z [ \ ] ^ _ 60 ` a B c d e f g h i j k lm n o 70 p q R s t u v w x y z { | } ~ DEL Bảng 1: Bộ m ã ASCII
- Ký tự trong ASCII được biểu diễn dưới hai dạng chính. Thứ nhất, dạng biểu diễn trong máy tính để máy tính có thể xử lý được. Đó là một giá trị số trong khoảng từ 0 tới 255, giá trị s ố này được gọi là một mã (code). Sở dĩ có khoảng giới hạn này vì người ta lấy đơn v ị x ử lý thông tin trong máy tính thời đó là 1 byte 8-bit. Ngay từ lúc ấy, cách biểu diễn thông tin của máy (chi tiết kỹ thuật) đã ảnh hưởng tới việc xác lập tập ký tự được mã hoá; thế nhưng khi đó chưa nảy sinh v ấn đề v ì không gian đó là đủ c ho mã hoá ngôn ngữ tiếng Anh. Dạng biểu diễn thứ hai cho ký tự là hình ảnh đồ hoạ c ủa chữ mà con người v ẫn quen thuộc và s ử dụng. Các hình đồ hoạ cho từng chữ (thuật ngữ chuyên môn gọi là hình chữ - glyph) được xác định trong một tệp đặc biệt gọi là tệp font chữ. Như v ậy, mỗi chữ đ ược xử lý độc lập trong máy tính qua mã s ố v à được hiển thị ra ngoài cho con người qua font chữ. Trên cơ s ở hai hình thức biểu diễn như v ậy, mặc nhiên có s ự thống nhất một cách biểu diễn ký tự theo các giá trị byte trong mọi hoạt động x ử lý, lưu trữ, truyền thông c ủa máy tính. Và điều này đã trở thành thói quen ăn sâu trong nhiều người lập trình. Vấn đề bắt đầu nảy sinh khi các ngôn ngữ khác của châu Âu cũng c ần đ ược mã hoá để c ó thể được xử lý trên máy tính. Cách giải quyết ban đầu là dùng bộ mã 8-bit mà nửa đầu chính là ASCII 7-bit, nửa sau được dùng thêm để mã hoá cho các ký tự khác, bên ngoài bộ c hữ tiếng Anh. Nhưng rồi cách giải quyết này c ũng không đủ, vì ngay ở c hâu Âu đã có nhiều thứ tiếng khác tiếng Anh: chữ Tây Âu, chữ Đông Âu, chữ Trung Âu, chữ Nga, chữ Ả Rập, chữ Do Thái, chữ Hy Lạp… Do đó, người ta đã đi theo xu hướng làm bội tải không gian mã hoá 8-bit, tức là c ũng một giá trị s ố 8-bit, tuỳ theo môi trường ngôn ngữ, sẽ được định nghĩa lại để ứng v ới những ký tự khác nhau trong các ngôn ngữ khác nhau. Một biến thể c ủa việc bội tải này là bộ ký tự ISO 8859. Cho tới nay, có trên một chục bộ ký tự cùng được mã hoá trong không gian 8-bit. M ột biến thể khác là t ổ hợp nhiều giá trị 8-bit để tạo ra không gian mã hoá lớn hơn, như được quy định trong chuẩn ISO 2022 và thịnh hành ở Nhật, Trung Quốc. Cách tiếp c ận thì v ẫn như v ậy: lấy con số được biểu diễn trong máy tính làm trung tâm và đặt tương ứng v ới ký tự bên ngoài. Cách tiếp c ận này được các công ty phần mềm hưởng ứng trong thập niên 1980-1990 v ới việc cho ra đời khái niệm trang mã (code page). IBM, Microsoft,… đều có các quy định trang mã riêng để dùng trong các dòng sản phẩm c ủa họ bán trên toàn thế giới. Thực chất của khái niệm trang mã là tập các giá trị mã c ố định (0- 255) được đặt tương ứng v ới nhiều tập ký tự khác nhau của các nước (bội tải tập mã). Từ đó, phát sinh ra khái niệm trang mã cho từng nước c ủa từng công ty, không giống nhau. Điều này đưa t ới những bất tiện lớn cho việc trao đổi thông tin đa ngữ v à các phần mềm c ần phải biết thêm nhiều thông tin phụ mới xử lý được. 1.2 Xây dựng bộ ký tự Unicode Bước vào thời đại xử lý thông tin toàn cầu, cách nghĩ v à cách giải quyết v ấn đề theo tư duy của bộ mã 8-bit không còn thích hợp nữa do mang nhiều yếu tố áp đặt c ủa k ỹ thuật lên thực tế. Cách tiếp c ận c ần đ ược đảo ngược lại: phải từ thực tế ngôn ngữ c ác nước rồi mới đi đến cách biểu diễn kỹ thuật trong máy tính, thay cho cách nghĩ từ góc độ kỹ thuật chiếu sang ngôn ngữ như trước đây (từ c ách mã trong máy tính rồi mới tới cách biểu diễn ký tự của ngôn ngữ). Người ta cần làm ra mô hình cho thế giới thực để từ đó mới chiếu vào trong máy tính, tạo ra mô hình bi ểu diễn trong máy tính mô phỏng cho thực tế. 2
- 1. Lập kho ký tự đa ngữ toàn cầu Mục tiêu: Cần xây dựng được bộ ký tự đa ngữ c ho toàn thế giới, từ đó mới tìm cách tạo lập mã và đưa vào trong máy tính. Vì vậy, v ấn đề đầu tiên là lựa chọn các chữ trên toàn thế giới đ ưa vào tập ký tự đa ngữ. Cần xác lập một loạt tiêu chuẩn cho việc chọn lựa chữ đưa vào bộ ký tự đa ngữ quốc tế này, và một trong những yêu c ầu quan trọng nhất là đảm bảo không có sự trùng lặp v ề h ình dạng của các chữ trong tập ký tự này. Bên c ạnh đó, các quy tắc chuẩn để phối hợp nỗ lực c ủa nhiều chuyên gia, nhiều nhóm chuyên gia ngôn ngữ c ũng phải được đặt ra để quản lý khối lượng công việc khổng lồ. Riêng việc chọn lựa các hình chữ đưa vào bộ ký tự này đã được tiến hành liên tục từ c uối những năm 1980 cho tới nay. Hiện nay, số chữ đã được thống nhất công nhận thuộc vào bộ ký tự đa ngữ quốc tế đã là trên 90.000 và trong tương lai sẽ c òn tăng lên trên 120.000. 2. Phân b ổ điểm mã cho các ký tự đã được nhận vào kho Một khi đã có sự thống nhất chung v ề các chữ được đưa vào bộ ký tự chung này, v ấn đề thứ hai nảy sinh là đặt cho từng chữ đó một mã s ố duy nhất - thuật ngữ chuyên môn gọi là điểm mã (codepoint) - để phân biệt và tham chiếu tới từng hình chữ đó. Điểm mã này đơn thu ần chỉ nh ư s ố thứ tự c ủa một phần tử trong một danh sách (chưa nói gì v ề v iệc biểu diễn số thứ tự này trong máy tính). Tuy nhiên, mã số này s ẽ đóng vai trò đại diện cho chữ đó trong các hoạt động x ử lý bên trong của máy tính. Từ đây xuất hiện v ấn đề khái niệm v ề ký tự (character) được mở rộng để bao quát cho cả xử lý của con người và của máy tính. Bây giờ, ký tự không còn chỉ đơn thuần là hình ch ữ mà chúng ta quen thuộc, mà còn là những cách biểu diễn khác nhau cho một con số được máy tính xử lý. Do đó, ký tự bây giờ được hiểu một cách trừu tượng độc lập v ới cách hiểu c ủa con người và máy tính. Để phân biệt các ký tự, người ta cần đặt tên phân biệt cho chúng, bên c ạnh mối tương ứng giữa ký tự đó v ới giá trị điểm mã và hình chữ trong font chữ. 3. Xác đ ịnh cách biểu diễn tương đương cho các ký tự Việc một ký tự c ó nhiều cách biểu diễn trong một ngôn ngữ là điều tương đối phổ biến trên thế giới, nhất là v ới các chữ khác chữ tiếng Anh. Điều này là một đặc trưng mà việc xử lý trước đây cho chữ tiếng Anh chưa đề cập tới. Chẳng hạn, trong nhiều ngôn ngữ, một hình ch ữ c ó thể được tạo ra bằng cách ghép nhiều hình chữ có sẵn, thuật ngữ chuyên môn gọi là tổ hợp ký tự. Giới hạn lại những thành ph ần sinh của một ngôn ngữ, chúng ta có một tập sinh nhỏ cùng các quy tắc để làm phát sinh ra tập lớn các dạng biểu diễn tạm thời của chữ trong câu. Và đó là hình thái mà nhiều ngôn ngữ trên thế giới sử dụng, khác v ới chữ tiếng Anh. Bởi v ậy, thêm một yêu cầu xuất hiện khi người ta làm việc v ới tập ký tự toàn c ầu: cần xác định các quy tắc biểu diễn tương đương cho ký tự v ề mặt ngôn ngữ. Một ký tự có thể có nhiều dạng biểu diễn được chấp nhận hợp pháp theo ngôn ngữ nào đó. Điều này đưa tới một số khái niệm mới trong Unicode như c ác dạng chuẩn cho ký tự (không phải cho mã), các ký tự dựng sẵn, tổ hợp và chính tắc. Tất c ả những v ấn đề này x ảy ra trên bình diện ngôn ngữ chứ không ph ải trên bình diện mã hoá. 4. Xác đ ịnh cách biểu diễn các điểm mã trong máy tính Trên cơ s ở c ủa những v ấn đề đ ã được làm mô hình hoá trên, b ước cuối cùng là xác định các cách biểu diễn tuần tự theo các byte (trong máy tính) cho các điểm mã. Có nghĩa là cuối cùng thì, theo cách nào, máy tính sẽ hi ểu các ký tự mà con người v ẫn hiểu? 3
- Ngay ở điểm này, tu ỳ theo tiến bộ kỹ thuật, có nhiều cách biểu diễn khác nhau cho một điểm mã. Nói riêng, Unicode đã đưa ra các định dạng biến đổi Unicode UTF, c ác dạng biểu diễn khác nhau cho c ùng m ột điểm mã, tuỳ theo môi trường xử lý bên trong máy tính. UTF-8 được thiết kế, là cách biểu diễn cho các điểm mã theo đơn v ị 8-bit nên một s ố ký tự đ ược biểu diễn bằng 1 byte, một s ố ký tự được biểu diễn bằng 2 byte, số khác bằng ba hay bốn byte. UTF-16 là cách biểu diễn cho điểm mã theo các đơn v ị 16 bit, môt số điểm mã được biểu diễn bằng một đơn v ị 16-bit, một số điểm mã khác được biểu diễn bằng hai đơn v ị 16-bit. UTF-32 là cách biểu diễn cho điểm mã theo đơn v ị 32-bit, tất c ả c ác điểm mã đều được biểu diễn qua một đơn v ị 32-bit này. Rõ ràng không có tương ứng duy nhất 1-1 giữa điểm mã và cách biểu diễn điểm mã trong máy tính, khác v ới cách kiến trúc của ASCII. Như c húng ta thấy, việc xây dựng và hình thành ra Unicode đã là quá trình đảo ngược lại v ới những gì đã làm cho ASCII. Nếu như v ới ASCII, chúng ta có tương ứng 1-1 giữa các khái niệm chính thì v ới Unicode, ta có tương ứng mới phức tạp hơn, không ph ải tất cả đều 1-1. Môi trường ASCII h ình ch ữ - Con ng ười k ý tự mã số b iểu diễn trong Máy móc d uy nh ất 1 byte Môi trường Unicode Con ng ười chu ỗi Các ký tự h ình ch ữ ký t ự hình ch ữ tương đương chu ỗi điểm mã điểm mã UTF-8 UTF-16 UTF-32 UCS-2 UCS-4 Máy móc Hình 1. Quan niệm của ASCII và Unicode về mã hoá 2. Kiến trúc Unicode Xuất phát từ c ác quan niệm v ề ASCII, nhưng khi xây dựng bộ ký tự đa ngữ quốc tế, nhiều yếu tố v à quan niệm mới đã được đưa vào để phản ánh trung thành v ới thực tế. 4
- 2.1 Unicode xét theo tập ký tự: Unicode là một tập ký tự đa ngữ, các ký tự được bố trí vào một miền s ố nguyên liên t ục từ 0 tới s ố lượng các chữ đã được chấp nhận đưa vào Unicode, mà số này v ẫn không ngừng tăng thêm lên. Thiết kế ban đầu của Unicode: Muốn giữ sự thuần nhất trong cách đánh mã, v ẫn tuân theo truy ền thống mã hoá 8-bit, nay chỉ mở rộng lên không gian 16-bit, do đó không gian ban đầu này bị giới hạn chỉ được 65.536 điểm mã. Thực tế đòi hỏi nhiều điểm mã hơn, do đó Unicode đưa ra kiến trúc bố trí các điểm mã theo các không gian gọi là mặt phẳng. Mặt phẳng là việc gộp nhóm các ký tự bên trong một ma trận 256x256 (mỗi mặt phẳng v ậy chứa tới 65.536 kí tự. Cũng có thể c oi mặt phẳng nh ư tập 65.536 điểm mã liên tục. Unicode định nghĩa ra 17 mặt phẳng. Mặt phẳng thứ nhất là đặc biệt, còn được gọi là Mặt phẳng 00 hay Mặt phẳng đa ngữ cơ s ở Basic Multilingual Plane (BMP), và chỉ có 63.488 điểm mã s ẵn có. 16 mặt phẳng còn lại được gọi là Mặt phẳng Bổ s ung (Supplementary Planes), tất cả đều có 65 536 điểm mã. 2048 điểm mã thiếu trong BMP (65 536 - 63 488) được gọi là điểm thay thế (surrogate) - đặc biệt trong đó có 1024 điểm thay thế c ao tiếp đó là 1024 điểm thay thế thấp. Chúng được dùng v ới nhau để tạo ra việc truy nhập vào 1 048 576 điểm mã trong 16 Mặt phẳng Bổ s ung. 2048 điểm thay thế được dùng chỉ c ho việc mã hoá UTF-16. Vậy, có tổng c ộng 1112064 điểm mã có sẵn trong Unicode. Mặt phẳng chuyên dụng bổ sung SSP Byte m ặt phẳng 16 Mặt phẳng chữ biểu ý bổ sung SIP Byte m ặt phẳng 02 Mặt phẳng đa ngữ bổ sung SMP Byte m ặt phẳng 01 Mặt phẳng đa ngữ cơ sở BMP Byte m ặt phẳng 00 00 80 FF điểm mã 80 D8..DF S-zone E0..F8 Vùng s ử dụng riêng F9-FF Hình 2 – Bố trí các mặt phẳng trong Unicode 5
- Unicode 3.0 đ ã định nghĩa 49 194 ký tự, tất cả đều trong BMP. Unicode 3.1 thêm hai ký tự v ào BMP, còn 44.944 ký tự c òn lại được gán cho ba Mặt phẳng bổ sung. Mặt phẳng đa ngữ bổ sung, hay Mặt phẳng 1, chứa nhiều bộ c hữ lịch s ử, và nhiều tập ký hiệu: Italic cổ, Gothic, Deseret, ký hiệu nhạc Byzantine, ký hiệu âm nhạc (phương Tây), và Ký hiệu chữ số toán học. Tất cả mặt phẳng này chứa 1.594 kí tự mới đ ược cấp điểm mã. Mặt phẳng chữ biểu ý bổ sung, hay Mặt phẳng 2, chứa một bộ rất nhiều chữ biểu ý thống nhất bổ sung - được biết với cái tên Vertical Extension B, chứa 42.711 ký tự, cũng như c hữ biểu ý tương hợp CJK bổ sung. Mặt phẳng chuyên dụng bổ sung, hay Mặt phẳng 14, chứa một tập các nhãn, có tất cả 97 ký tự (Hình 2). Phiên bản cuối c ủa Unicode là Phiên bản 3.1, có đến 94140 ký tự đã được gán cho BMP và ba Mặt phẳng bổ s ung, như được nêu trong bảng 2: Mặt phẳng Tên mặt phẳng Số kí tự 0 (0x00) Mặt phẳng đa ngữ cơ s ở (Basic Multilingual 49.196 Plane -BMP) U+0000..U+FFFF 1 (0x01) Mặt phẳng đa ngữ bổ sung (Supplementary 1.594 Multilingual Plane - SMP) U+10000..U+1FFFF 2 (0x02) Mặt phẳng chữ biểu ý bổ sung (Supplementary 43.253 Ideographic Plane - SIP) U+20000..U+2FFFF 14 (0x0E) Mặt phẳng chuyên dụng bổ sung (Special 97 Purpse Plane - SPP) U+E0000..U+EFFFF Bảng 2. Các mặt phẳng đã cấp mã trong Unicode Mỗi ký tự được mã hoá trong Unicode hay ISO/IEC 10646 đều được gán cho một tên gọi duy nhất. Tên gọi này ký hiệu cho ý nghĩa thông th ường của ký tự đó, hoặc mô tả hình dáng c ủa ký hiệu đồ hoạ tương ứng, hoặc tuân theo quy tắc đặt tên cho các chữ biểu ý CJK. 2.2 Các kho chữ đã được đưa vào Unicode Để c ho tiện, không gian mã c ủa chuẩn Unicode được chia thành nhiều vùng, mỗi vùng lại được chia thành các khối: Vùng chữ v iết chung, bao gồm các chữ v iết theo bảng chữ c ái và âm tiết v ới · tập ký tự tương đối nhỏ, như La-tinh, Cyrillic, Hy Lạp, Do Thái, A rập, Devanagari và Thái. Vùng ký hiệu, kể cả rất nhiều ký hiệu và dingbat, các dấu ngắt, ký hiệu toán · học, hoá học, kĩ thuật và những sử dụng đặc biệt khác. Vùng ký hiệu và phát âm CJK, bao g ồm dấu ngắt, ký hiệu, bộ thủ, và phát · âm cho các loại riêng: tiếng Trung Quốc, Nhật Bản và Hàn Quốc. Vùng chữ biểu ý CJK, chứa 27.484 chữ biểu ý CJK thống nhất. · Vùng âm ti ết Yi, c hứa 1.165 âm tiết và 50 b ộ thủ Yi · Vùng âm ti ết Hangul, chứa 11.172 âm tiết Hangul Hàn Quốc dựng s ẵn. · 6
- Vùng thay thế (surrogate), chứa 1024 ký tự thay thế nửa thấp và 1024 kí tự · thay thế nửa cao được dùng trong phương pháp mở rộng thay thế để truy nhập v ào hơn 1 triệu mã cho việc mở rộng tương lai. · Vùng s ử dụng riêng, chứa 6400 v ị trí mã được dùng cho các kí tự do người dùng hay nhà sản xuất định nghĩa. · Vùng tương h ợp và đặc biệt, chứa nhiều kí tự được sử dụng nhiều trong các chuẩn công ty và quốc gia mà có cách biểu diễn khác theo mã hoá Unicode, cũng như nhiều ký tự dùng đặc biệt. Mọi giá trị điểm mã trong chuẩn Unicode đều truy nhập được qua phương di ện điện tử; việc gán đích xác mã ký tự ít có ảnh hưởng tới xử lý thông tin. Dầu v ậy, để cho thuận tiện v ới người dùng, các mã được gộp nhóm theo phân loại ngôn ngữ v à chức năng. Danh sách sau cung cấp một tổng quan về v iệc c ấp không gian mã cho các ngôn ngữ v à chữ v iết. Unicode hiện tại đã đặt mã cho những ngôn ngữ v à bộ ký tự s au trong mặt phẳng đa ngữ cơ s ở BMP: BASIC LATIN OPTICAL CHARACTER CJK UNIFIED IDEOGRAPHS RECOGNITION EXTENSION A LATIN 1 SUPPLEMENT ENCLOSED ALPHANUMERICS OGHAM LATIN EXTENDED A BOX DRAWING RUNIC LATIN EXTENDED B BLOCK ELEMENTS SINHALA IPA EXTENSIONS GEOMETRIC SHAPES SYRIAC SPACING MODIFIER LETTERS MISCELLANEOUS SYMBOLS THAANA COMBINING DIACRITICAL MARKS DINGBATS BURMESE BASIC GREEK CJK SYMBOLS AND KHMER PUNCTUATION GREEK SYMBOLS AND COPTIC HIRAGANA CYRILLIC KATAKANA ARMENIAN BOPOMOFO BASIC HEBREW HANGUL COMPATIBILITY JAMO HEBREW EXTENDED CJK MISCELLANEOUS BASIC ARABIC ENCLOSED CJK LETTERS AND ARABIC EXTENDED MONTHS DEVANAGARI CJK COMPATIBILITY BENGALI HANGUL GURMUKHI HANGUL SUPPLEMENTARY A GUJARATI HANGUL SUPPLEMENTARY ORIYA CJK UNIFIED IDEOGRAPHS TAMIL PIRVATE USE AREA TELUGU CJK COMPATIBILITY KANNADA IDEOGRAPHS MALAYALAM ALPHABETIC PRESENTATION THAI FORMS LAO ARABIC PRESENTATION FORMS A BASIC GEORGIAN COMBINING HALF MARKS GEORGIAN EXTENDED CJK COMPATIBILITY FORMS HANGUL JAMO SMALL FORM VARIANTS LATIN EXTENDED ADDITIONAL ARABIC PRESENTATION GREEK EXTENDED FORMS B GENERAL PUNCTUATION HALFWIDTH AND FULLWIDTH SUPERSCRIPTS AND FORMS SUBSCRIPTS SPECIALS CURRENCY SYMBOLS HANGUL EXTENDED COMBINING DIACRITICAL ETHIOPIC MARKS FOR SYMBOLS UNIFIED CANADIAN LETTERLIKE SYMBOLS ABORIGINAL SYLLABICS NUMBER FORMS CHEROKEE ARROWS YI SYLLABLES MATHEMATICAL OPERATORS YI RADICALS MISCELLANEOUS TECHNICAL BRAILLE PATTERNS CONTROL PICTURES 7
- Bảng 3 cho một hình ảnh v ề các vùng trong BMP đã được cấp mã cho các ngôn ngữ chính! U+0000 U+0000 Latin Các bộ U+0100 U+1000 chữ chung U+0200 U+0300 Hy Lạp U+2000 U+0400 Cyrillic Các ký hiệu U+0500 Armenia/Do Thái U+3000 U+0600 Ả Rập U+0700 Syria / Thaana U+4000 U+0800 U+0900 Devanagari/Bengali U+5000 U+0A00 Gurmukhi/Gujarati U+0B00 Oriya/Tamil U+6000 U+0C00 Telugu/Kannada CJK U+0D00 Malayalam/Sinhala U+7000 U+0E00 Thai/Lao U+0F00 Tibetan U+8000 U+1000 Myanmar/Georgian U+1100 Hanhul Jamo U+9000 U+1200 Ethiopic U+1300 Cherokee U+A000 U+1400 Canadian Aboriginal U+1500 Syllabic U+B000 U+1600 Ogham/Runic U+1700 Khmer U+C000 Hangul U+1800 Mongolian U+1900 U+D000 U+1A00 U+1B00 surrogate U+E000 Vùng sử U+1C00 dụng riêng U+1D00 U+F000 U+1E00 Latin mở rộng Vùng tương U+1F00 Hi Lạp mở rộng hợp U+2000 Bảng 3. Các vùng trong BMP 2.3 Unicode, xét theo các cách mã hoá khác nhau Cả hai chuẩn Unicode và ISO/IEC 10646 trước hết đều là các bảng lớn gán cho mọi ký tự một số nguyên. Nếu ta dùng các thuật ngữ "UCS", "ISO/IEC 9
- 10646", hay "Unicode", thì điều này chỉ nói tới ánh xạ giữa các ký tự v à số nguyên. Điều này không xác định cách ghi nhớ các số nguyên này như một dãy các byte trong bộ nhớ. Unicode ban đầu xét cách mã hoá là UCS-2, không đưa ra điều khoản nào nói v ề các ký tự bên ngoài BMP (U+0000 tới U+FFFF). Khi người ta thấy cần nhiều hơn 64K ký tự cho một số ứng dụng (các bảng chữ lịch sử v à chữ biểu ý, các ký hiệu toán học và in ấn...), Unicode được chuyển thành tập ký tự 21 bit v ới các điểm mã trong phạm vi U-00000000 tới U-0010FFFF. 2×1024 ký tự thay thế (surrogate) (U+D800 tới U+DFFF) được đưa vào trong BMP để cho phép biểu diễn 1024×1024 ký tự không trong BMP như một dãy hai ký tự thay thế 16-bit. Theo cách này, đã phát sinh ra UTF-16, v ốn biểu diễn cho Unicode "21 bit" mở rộng theo cách tương hợp v ề trước v ới UCS-2. Thuật ngữ UTF-32 được đưa vào Unicode để ngụ ý cách mã 4-byte cho Unicode "21 bit" mở rộng. UTF-32 đích xác là UCS-4, ngoại trừ rằng theo định nghĩa UTF-32 không bao giờ được dùng để biểu diễn cho các kí tự trên U-0010FFFF, trong khi UCS-4 có thể bao quát tất cả 231 v ị trí mã cho tới U-7FFFFFFF. Bên cạnh tất cả những điều đó, UTF-8 đã được đưa vào để cung cấp cách mã hoá nhiều byte tương hợp v ề trước v ới ASCII. Các định nghĩa của UTF-8 trong ISO/IEC 10646 và Unicode thực tế có hơi khác nhau: trong UCS, các dãy UTF-8 dài tới 6 byte có thể biểu diễn cho tới U-7FFFFFFF; trong khi ở Unicode các dãy UTF-8 dài tới 4 byte được định nghĩa để biểu diễn các ký tự cho tới U- 0010FFFF. Sự khác biệt v ề bản chất là hệt như giữa UCS-4 và UTF-32. Không có ngụ ý v ề đầu cuối bé cho UCS-2, UCS-4, UTF-16, và UTF-32, mặc dầu ISO/IEC 10646-1 nói rằng đầu cuối lớn nên được ưa chuộng hơn, trừ phi được đồng ý khác đi. Người ta đã quen viết thêm chữ "BE" (Bigendian, đầu cuối lớn, byte cao trước) và "LE" (Littleendian, đầu cuối bé, byte thấp trước) vào tên cách mã để xác định tường minh thứ tự byte. 2.4 Unicode xét theo định dạng chuyển đồi Unicode UTF Phiên bản cuối của Unicode hỗ trợ cho ba định dạng chuyển đổi: UTF-8, UTF-16, và UTF-32. Các con số được dùng trong những cái tên này - 8, 16, và 32 - biểu thị cho đơn v ị cơ sở tính theo số bit. Chẳng hạn, UTF-8 được tạo nên từ các đơn v ị 8 bit (mỗi một trong chúng tương đương v ới một byte). UTF-16 được tạo nên từ các đơn v ị 16 bit, và UTF-32 dùng các đơn v ị 32 bit. Ba định dạng chuyển đổi này có một khía cạnh chung. Tất cả 1.048.576 điểm mã của 16 Mặt phẳng bổ sung đều được biểu diễn bằng 4 byte hay 32 bit. UTF-8 dùng bốn byte, UTF-16 dùng hai đơn v ị 16-bit (điểm thay thế cao và thấp), còn UTF-32 dùng một đơn v ị 32 bit. Cách mã hoá UTF-8 Cách mã hoá UTF-8 có chiều dài thay đổi, và các ký tự được mã hoá bằng một, hai, ba hay bốn bytes. 128 ký tự đầu tiên của Unicode (BMP), U+0000 tới U+007F, được mã hoá bằng một byte, và tương đương v ới ASCII. U+0080 tới 10
- U+07FF (BMP) được mã hoá bằng hai byte, còn U+0800 tới U+FFFF (v ẫn trong BMP) được mã hoá bằng ba byte. 1.048.576 ký tự của 16 Mặt phẳng Bổ sung được mã hoá bằng bốn byte. Cách mã hoá UTF-16 Cách mã hoá UTF-16 là cách biểu diễn 16-bit chiều dài thay đổi. Mỗi ký tự đều được tạo nên từ một hay hai đơn v ị 16 bit. Dưới dạng byte thì mỗi ký tự được tạo nên từ hai tới bốn byte. Phần riêng 16-bit của cách mã hoá này được dùng để mã hoá cho toàn bộ BMP, ngoại trừ 2.048 điểm mã được biết tới là "điểm thay thế" v ốn được dùng theo cặp để mã hoá cho 1048576 ký tự của các mặt phẳng bổ sung. U+D800 tới U+DBFF là 1024 điểm thay thế cao, còn U+DC00 tới U+DFFF là 1024 điểm thay thế thấp. Điểm thay thế cao cộng v ới thấp (tức là hai đơn v ị 16-bit) biểu diễn cho một ký tự trong 16 Mặt phẳng bổ sung. Cách mã hoá UTF-32 Cách mã hoá UTF-32 là biểu diễn cố định 32-bit (bốn byte). Những người quen v ới cách mã hoá UCS-4 nên lưu ý rằng cách mã hoá UTF-32 đơn giản là tập con của cách mã hoá UCS-4 v ốn đặc biệt bao quát cả 17 Mặt phẳng của Unicode. Nói cách khác, phạm vi mã hoá của UTF-32 là 0x00000000 tới 0x0010FFFF. Thứ tự byte của UTF-16 và UTF-32 Cách mã hoá UTF-8 được tạo nên từ các byte. Mỗi ký tự được biểu diễn bằng một, hai, ba hay bốn byte. Các cách mã hoá UTF-16 và UTF-32 được tạo nên từ các đơn v ị 16- và 32 bit tương ứng. Điều này có nghĩa là thứ tự byte thành có ý nghĩa. Cũng may mắn là người phát triển được khuyến khích dùng Dấu hiệu thứ tự byte Byte Order Mark (BOM) làm ký tự đầu tiên trong dữ liệu từ UTF-16 hay UTF-32. Điều này báo cho phần mềm diễn giải v ề kiểu thứ tự byte cần dùng. Hai thứ tự byte được gọi là đầu cuối bé và đầu cuối lớn (little- và big- endian). Các bộ xử lý Intel, v ốn là động lực cho các máy tính chạy Windows, dùng thứ tự byte đầu cuối bé. Phần lớn các máy tính chạy Mac OS và phần lớn máy tính dùng Unix sử dụng thứ tự byte đầu cuối lớn. BOM được biểu diễn trong cách mã hoá UTF-16 là 0xFEFF cho thứ tự byte đầu cuối lớn và 0xFFFE cho đầu cuối bé. Chúng là 0x0000FEFF và 0xFFFE0000 theo cách mã hoá UTF-32. Một ví dụ: ta xét hai byte 0x4E và 0x00. Xem như một đơn v ị 16-bit, chúng trở thành 0x4E00 hay 0x004E, tuỳ theo thứ tự byte. 0x4E00 (đầu cuối lớn) là chữ Hán "nhất", và 0x004E (đầu cuối bé) là ký tự Latin "N". 3. Khái niệm ký tự Chúng ta thường hiểu ký tự là hình v ẽ đồ hoạ nào đó biểu diễn cho một thành tố ngôn ngữ v à được biểu diễn trong máy bằng một con số. Ký tự trong tin học bây giờ được hiểu là một khái niệm trừu tượng, có tên riêng, có hình dạng thể hiện đồ hoạ qua phông chữ, nhưng lại có thể có nhiều dạng biểu diễn khác nhau tuỳ theo ngôn ngữ và máy tính. 11
- Unicode phân biệt rõ giữa khái niệm ký tự v à hình chữ, không đồng nhất hai khái niệm này như trong ASCII. Hình chữ chỉ là dạng biểu diễn đồ hoạ cho ký tự, trong khi ký tự là khái niệm trừu tượng và bao gồm nhiều khía cạnh biểu diễn khác nhau. Hình chữ chỉ là một dạng biểu diễn con người thấy được, còn ký tự có thể có nhiều dạng biểu diễn khác để cho nhiều loại phần cứng và phần mềm khác nhau có thể hiểu được. Kí tự trừu tượng Các dạng chuẩn Ký tự Tên gọi Dựng sẵn Tên gọi Ký tự Tổ hợp Ký Ký tự tự Tên gọi Chính tắc Ký tự Ký Ký Ký tự tự tự biểu diễn byte Mã số duy nhất Người dùng trong máy Đơn vị mã Đơn vị mã Điểm mã Hình chữ Đơn vị mã Hình chữ Điểm mã Hình chữ Định dạng chuyển đổi Điểm mã Unicode : UTF-8, UTF-16, UTF-32 Phông chữ Hình 3 - Quan hệ giữa hình chữ, ký tự, điểm mã, đơn vị mã Một mặt, mỗi ký tự được đặt tương ứng v ới một giá trị số duy nhất được gọi là điểm mã, và không có hai ký tự nào có hình thức biểu diễn đồ hoạ giống nhau mà lại được phép có các giá trị điểm mã khác nhau. Nhưng mặt khác, tuỳ theo đòi hỏi của các ngôn ngữ thực tế, mỗi ký tự lại cũng có thể được biểu diễn bằng một dãy các ký tự khác, và bằng cách tổ hợp dãy ký tự này thì sẽ cho ký tự ban đầu. Như v ậy, một ký tự trong Unicode được phép hoặc biểu diễn bằng một thành tố duy nhất, hoặc được biểu diễn bởi một chuỗi các thành tố tạo nên nó. Unicode chấp nhận nhiều cách biểu diễn cho cùng một ký tự qua nhiều dạng biểu diễn khác nhau. Vấn đề phân biệt, nhận diện từ các dạng biểu diễn cụ thể để tới khái niệm ký tự trừu tượng là nhiệm v ụ của những người làm cài đặt bộ ký tự mã hoá. 12
- Unicode định nghĩa ra nhiều định dạng biến đổi Unicode (Unicode Transformation Format - UTF) để biểu diễn các giá trị điểm mã cố định của Unicode trong các máy tính. Điều cần lưu ý rằng đây là các dạng biểu diễn trong máy cho ký tự chứ không phải là bản thân ký tự, và tuỳ hoàn cảnh và môi trường, cách biểu diễn có thể thay đổi. Người lập trình phải biết đoán nhận các môi trường đó để nhận diện cho đúng ký tự. 4. Cài đặt Unicode Cần nhấn mạnh một điều: trong Unicode, không có khái niệm mã tổ hợp hay mã dựng sẵn như nhiều người làm phần mềm chúng ta v ẫn nghĩ. Trong Unicode chỉ có khái niệm ký tự tổ hợp, ký tự dựng sẵn v à các kỹ thuật thực hiện ký tự tổ hợp. Đây là điều cần được lưu ý để tránh nhầm lẫn v ề khái niệm. Chúng ta đã quen gọi cách mã hoá dựng sẵn hay mã hoá tổ hợp do thói quen dùng bộ mã ASCII trước đây, khi đối tượng xem xét chính của người lập trình là các mã. Nhưng trong các chuẩn quốc tế chưa hề có các khái niệm này. Thực chất, tất cả các ký tự được mã hoá trong Unicode đều là ký tự dựng sẵn, không phải mã dựng sẵn. Tuy nhiên Unicode, bên cạnh quan niệm v ề ký tự dựng sẵn này, đã khuyến khích phát triển các kỹ thuật tổ hợp để xử lý cho các ký tự tổ hợp, không phải mã tổ hợp. Để khuyến khích sử dụng Unicode cho nhiều ngôn ngữ, Unicode đưa ra định nghĩa v ề các cách thức tổ hợp ký tự, các khái niệm v ề ký tự tổ hợp, và đây là xu thế phát triển mới mà người phát triển phần mềm cần hiểu rõ và làm chủ. Như v ậy, Unicode là duy nhất theo nghĩa mỗi ký tự có một điểm mã duy nhất, và hình chữ ứng v ới điểm mã đó là hình chữ dựng sẵn. Tuy nhiên, khác v ới ASCII, Unicode chấp nhận nhiều mức độ cài đặt để thể hiện thêm các khả năng xử lý cho các ngôn ngữ ngoài tiếng Anh. Mức độ thứ nhất là là cài đặt ký tự dựng sẵn không có ký tự tổ hợp. Các mức cài đặt sau chấp nhận cách tổ hợp ký tự. Tất nhiên, đây là một trong những hướng mở rộng kỹ thuật để bao quát và giải quyết mọi v ấn đề liên quan tới việc xử lý cho các ngôn ngữ khác tiếng Anh. Unicode còn đưa ra nhiều khuyến cáo, nhiều thuật toán, giải thuật để xử lý cho nhiều loại hình ngôn ngữ khác nhau như: xử lý chiều v ăn bản (phải sang trái, trái sang phải), tìm kiếm, sắp xếp… Nhiều hội thảo v ề xử lý bàn phím, xử lý hiển thị ký tự, kỹ thuật tổ hợp ký tự… đã được tổ chức. Mô hình ký tự của Unicode nhấn mạnh việc phân biệt rõ một ký tự có thể có nhiều dạng biểu diễn, tuỳ thuộc vào những tầng mức khác nhau. Tại tầng ngôn ngữ, trong các v ăn bản, việc xử lý và lưu trữ có thể tiến hành trên nhiều dạng biểu diễn ký tự khác nhau. Tại tầng kỹ thuật, ký tự có thể có dạng lưu trữ khác v ới dạng hiển thị, khác v ới dạng truyền thông… Ngay trong một máy tính, một ký tự cũng có thể có nhiều dạng biểu diễn khác nhau theo các đơn v ị biểu diễn 8- bit, 16-bit, 32-bit. Tất cả những dạng khác nhau đó đều biểu thị chung cho ký tự trừu tượng, và phần mềm v ẫn phải đủ tổng quát để hiểu, đoán nhận và xử lý mọi dạng khác nhau đó. Trong những v ấn đề này, rõ ràng kỹ thuật xử lý ký tự tổ hợp là rất quan trọng và cần được nắm v ững. 13
- Việc làm chủ Unicode đòi hỏi chúng ta không chỉ biết v ề kiến trúc của Unicode, cách sử dụng các điểm mã được biểu diễn trong máy tính thế nào, mà điều quan trọng hơn là cần phải biết được, nắm được những kỹ thuật mới xử lý cho các v ấn đề mới (so v ới quan điểm cũ v ề xử lý đồng nhất một dạng biểu diễn của ASCII) của các ngôn ngữ Yêu cầu tất yếu cho mọi công ty làm trên thế giới. Do đó, việc có các phần mềm muốn v ươn ra thị trường quốc hội thảo bàn v ề những kỹ thuật tế: cần phải quốc tế hoá phần mềm, cần cài đặt của Unicode là rất quan phải nhìn vấn đề xử lý thông tin theo góc trọng, có tính chất nâng cao trình độ mọi ngôn ngữ trên thế giới chứ không độ v à hiểu biết chung của người chỉ giới hạn vào riêng một ngôn ngữ nào. làm công nghệ thông tin. Việc học Muốn xuất khẩu phần mềm cho thị tập v ề những kỹ thuật tổ hợp nói trường quốc tế, Unicode là chiến lược riêng là rất quan trọng để chúng quốc tế hoá dứt khoát phải được tính tới. ta tiến lên ngang hàng v ới trình độ xử lý quốc tế, không thể chỉ bằng lòng và dừng lại v ới những kỹ thuật giải quyết ký tự dựng sẵn trước đây. 5. Unicode và phát triển phần mềm Như trên đã trình bầy, nhu cầu của thời đại trao đổi thông tin toàn cầu đã đặt ra yêu cầu tất yếu cho mọi công ty làm phần mềm muốn v ươn ra thị trường quốc tế: cần phải quốc tế hoá phần mềm, cần phải nhìn vấn đề xử lý thông tin theo góc độ mọi ngôn ngữ trên thế giới chứ không chỉ giới hạn vào riêng một ngôn ngữ nào. Tất nhiên, nếu ngay từ đầu phần mềm đã được định hướng chỉ phục v ụ cho một thị trường riêng biệt thì chẳng cần để ý đến điều này làm gì. Nhưng tất cả những ai có con mắt nhìn toàn diện và bao quát sẽ không thể bằng lòng v ới cách làm việc cũ được nữa. Hiện nay, muốn xuất khẩu phần mềm cho thị trường quốc tế, Unicode là chiến lược quốc tế hoá dứt khoát phải được tính tới. Ngay cả các công ty và người làm phần mềm ở Mỹ cũng phải thừa nhận rằng xử lý ngôn ngữ tiếng Anh, và đi kèm v ới nó là sử dụng bộ mã ASCII v ới quan niệm tập ký tự tương ứng một byte cho mỗi ký tự (SBCS – single byte per character set), là đơn giản, không còn v ấn đề gì khó khăn nữa. Khó khăn bây giờ nằm ở chỗ khi mở ra thị trường toàn cầu, nhiều ngôn ngữ khác nhau đòi hỏi cách xử lý khác v ới kiểu truyền thống, cần xử lý đồng thời cho nhiều ngôn ngữ khác nhau, trong đó có cả ngôn ngữ không theo quan niệm SBCS, chỉ dùng cách tổ hợp kí tự. Điều này có nghĩa là phần mềm phải xử lý chung cho các ngôn ngữ có nhiều cách biểu diễn cho các ký tự. Bộ ký tự đa ngữ Unicode ra đời để đáp ứng cho việc thống nhất xử lý các loại chữ v iết trên thế giới. Riêng đối v ới việc phát triển phần mềm cho chữ Việt, chúng ta cũng cần phải thấy rõ một điều: chữ Việt có nhiều cách biểu diễn, đó là bản chất của chữ Việt. Việc Unicode chấp nhận nhiều dạng biểu diễn cho ký tự Việt cũng là điều chung cho mọi ngôn ngữ khác chứ không phải là việc Unicode không nhất quán trong cách biểu diễn cho chữ Việt. Việc tranh cãi giữa chọn các kỹ thuật dựng sẵn hay tổ hợp hoàn toàn không phải là vấn đề thực chất của Unicode, nó chỉ phản ánh thói quen cũ của chúng ta trong cách xử lý cho các đặc trưng chữ Việt 14
- và chưa nhạy bén để chuyển sang những kỹ thuật mới. Unicode hoàn toàn hỗ trợ cho cả hai kỹ thuật này, và nói riêng Unicode đã đưa ra rất nhiều cách giải quyết mới, được đề xuất đáp ứng cho kỹ thuật tổ hợp, mà mọi người phát triển phần mềm đều cần biết tới và sử dụng. Quyết định sử dụng các kỹ thuật dựng sẵn hay tổ hợp trong kiến trúc xử lý bên trong của phần mềm là hoàn toàn tuỳ thuộc nhà sản xuất, miễn là tuân thủ các quy định của Unicode. Đối v ới chữ Việt, một yêu cầu chính của người dùng cần được tôn trọng là dạng hiển thị đưa ra phải là dựng sẵn. Đối v ới các hệ thống dùng cả hai kỹ thuật này, đương nhiên cần có các bộ chuyển đổi dạng biểu diễn dựng sẵn và tổ hợp. Nếu chúng ta giải quyết tốt và sử dụng thành thạo kỹ thuật tổ hợp cho trường hợp chữ Việt thì đó cũng là một thành công lớn trong việc tiếp cận tới những tiến bộ công nghệ mới của thế giới. Và thực sự môi trường tiếng Việt cũng là nơi thử nghiệm để chúng ta bước ra thị trường quốc tế, nơi đòi hỏi thành thạo cả hai kỹ thuật dựng sẵn và tổ hợp, và phần nào đó kỹ thuật tổ hợp còn được nhấn mạnh hơn. Lý do rất đơn giản là ngay từ bây giờ, đã có nhiều dạng biểu diễn cho ký tự trong máy tính và chúng ta phải biết cách làm chủ mọi dạng biểu diễn, khi đó phần mềm mới có khả năng đáp ứng cho nhiều loại hình ngôn ngữ trên thế giới. Nếu cứ khăng khăng chỉ dùng kỹ thuật dựng sẵn mà không mạnh dạn bước sang kỹ thuật tổ hợp, chúng ta sẽ không thể tiếp thu được những kỹ thuật mới. Các công ty CNTT lớn như Microsoft, IBM, Oracle... đều đã triển khai sử dụng kỹ thuật tổ hợp ký tự trong các ứng dụng cho nhiều ngôn ngữ trên thế giới, trong đó có chữ Việt. Việc học hỏi, tiếp thu những tri thức mới qua những kỹ thuật mới của các công ty này là điều kiện rất cơ bản để các chuyên viên CNTT trong nước tiến tới đáp ứng được những yêu cầu mới của thị trường phần mềm quốc tế. (Hà Nội 4/11/2002) Tài liệu tham khảo 1. Ken Lunde, How to interoperate between UTF-8, UTF-16, and UTF-32, Manager, CJKV Type Development, Adobe Systems, September 2001 2. Ken Whistler. Mark Davis, Unicode Technical Report #17: Character Encoding Model, 1999 3. Mark Davis, Martin Durst, Unicode Technical Report #15: Unicode Normalization Forms, 1999 4. Mark Davis, Unicode Technical Report #19: UTF-32, 1999 5. Markus Scherer, How Unicode relates to code pages, character set and encoding, IBM Unicode Technology Group. 6. Markus Kuhn, UTF-8 and Unicode FAQ for Unix/Linux, http://www.cl.cam.ac.uk/~mgk25/unicode.html 7. Peter K. Edberg, Survey of Character Encodings, Apple Computer, Inc. 8. The Unicode Standard Version 3.0, The Unicode Standard Version 3.1 9. ISO/IEC 10646-1: 2000 10. Trần Lưu Chương, Ngô Trung Việt, Mã hoá ngôn ngữ và Unicode, Tài liệu tập huấn sử dụng Unicode, Ban công tác mã chữ quốc ngữ theo Unicode, Bộ KH CN MT, 2001 15
- BẢN CHẤT CỦA XỬ LÝ TIẾNG VIỆT TRÊN MÔI TRƯỜNG ĐA NGỮ. Hà Thân. Chúng tôi cố gắng mô tả lại một số vấn đề căn bản, có thể là hơi dài dòng đối với những chuyên gia, nhưng để đi từng bước logic, cung cấp thông tin cho đông đảo Người Sử Dụng(NSD) nắm được vấn đề. Nếu có gì vụng về xin người đọc chỉ giáo cho và xin được tha thứ. Khi phát triển các ứng dụng cho người sử dụng bản địa, các chuyên gia phần mềm đứng trước thách thức làm sao cho tiếng bản địa trong các ứng dụng đó phải thể hiện đúng và đầy đủ bản sắc bản địa của nó- chứ không thể lẫn vào ngôn ngữ nào khác. Hơn nữa khi đưa những ứng dụng đó tìm thị trường ngoài nước thì quá trình toàn cầu hoá sản phẩm chính là bản địa hoá. Thị trường Nhật đại đa số dùng ứng dụng tiếng Nhật; Pháp dùng tiếng Pháp; ...Bên cạnh vấn đề hiển thị được các ký hiệu bản địa đặc trưng, người sử dụng bản địa còn muốn các ứng dụng trên máy tính của họ đáp ứng được những tập quán, quy ước của ngôn ngữ viết, định dạng về ngày tháng, tiền tệ, thứ tự sắp xếp... Do đó, bất kỳ một ứng dụng có xử lý ngôn ngữ bản địa hoặc xử lý đa ngữ đều phải xử lý và đáp ứng đầy đủ các yêu cầu căn bản sau: - Tính bản địa(locales). - Mã hoá ký tư(encoding)̣: Biểu diễn các ký tự của ngôn ngữ trong máy để xử lý, trao đổi, lưu trữ thông tin. - Hiển thị ký tự bản địa(display). - Bàn phím nhập ký tự bản địa(input method). Các khái niệm căn bản về xử lý ngôn ngữ bản địa và xử lý đa ngôn ngữ. Tính bản địa. Tính cách bản địa (locale) là tập hợp các thông tin liên quan đến ngôn ngữ của người sử dụng và ngôn ngữ trực hệ(sublanguage) của nó. Ví dụ ngôn ngữ trực hệ tiếng Anh là loại tiếng Anh dùng ở Singapore, Úc, ...Xử lý thông tin bản địa (locale factors) bao gồm các công việc sau đây: - định dạng kiểu ngày, giờ. - tạo ra lịch. - định dạng con số và ký hiệu tiền tê. - so sánh các chuỗi. - xếp thứ tự các chuỗi. - xác định các bảng mã. - phát sinh ra dấu hiệu font chữ bản địa. - đánh số các bảng mã trong hệ thống. - cách viết tắt tên quốc gia/ tỉnh. 16
- - hệ thống đơn vị đo lường. - chiều viết của chữ, thông tin mã hoá ký hiệụ,.. - ...... HĐH và các ứng dụng xử lý đúng tính cách bản địa của văn bản theo một cách mã hoá chuẩn được HĐH hỗ trợ. Lược đồ mã hoá ký tự(ánh xạ ký tự). Lược đồ mã hoá ký tự (Character Encoding Scheme)là quá trình biến các ký tự thành dạng biểu diễn như dữ liệu thực tại trong máy tính. CES thường gọi gọn lại là (cách hoặc dạng) mã hoá(Encoding). Trước tiên xác định tập các ký tự cần mã hoá. Tiếp theo, gán(ánh xạ) cho mỗi ký tự một số nguyên không âm- số nguyên đó được gọi là điểm mã(code point) cho ký tự đó. Ký tự đã được gán cho một số nguyên như vậy gọi là một ký tự được mã. Tập hợp những điểm mã của một tập ký tự của một hoặc một nhóm ngôn ngữ còn gọi là một Trang mã(CP: Code Page), hoặc Bảng mã hoặc nôm na hơn là Bộ mã. Các điểm mã thường viết dưới dạng thập lục phân. Như trong Bảng mã CP1258 và bảng mã Unicode, điểm mã của chữ ơ lần lượt là F5 và 01A1. Việc tiếp theo nữa là gán cho(ánh xạ) mỗi điểm mã một dãy những byte, mỗi byte đó gọi là một đơn vị mã(code unit). Dãy các đơn vị mã không nhất thiết có cùng chiều dài, có thể là 1, 2,3, 4 bytes,...và các đơn vị mã không nhất thiết phải là một phần của tập ký tự được mã hoá. Ký tự được biểu diễn bởi dãy các đơn vị mã đều có cùng chiều dài được gọi là dạng mã hoá ký tự có chiều ngang cố định. Ví dụ: - Dạng mã hoá ký tự một byte(SBCS), dùng 8 bit để mã hoá 256 ký tự khác nhau, ví dụ như các ký tự của hệ chữ châu Âu. - Mã hoá ký tự hai byte(DBCS), dùng đến 16 bit để mã hoá cho các ngôn ngữ, phần lớn là các ngôn ngữ tượng hình của châu Á. Ví dụ: bảng mã CP 932 cho tiếng Nhật, CP 950 cho tiếng Hàn .... Ký tự được biểu diễn bởi dãy các đơn vị mã không có cùng chiều dài được gọi là dạng mã hoá ký tự có chiều ngang biến thiên. Ví dụ: - Dạng mã hoá ký tự UTF-8 trong bộ ký tự Unicode có từ một cho tới sáu đơn vị mã 8-bit. - Dạng mã hoá ký tự UTF-16 trong bộ ký tự Unicode có từ một cho tới hai đơn vị mã 16-bit. Trong Unicode để kết thúc quá trình mã hoá thì còn cần phải làm tuần tự hoá (serialization) các đơn vị mã cho mọi điểm mã rộng hơn một byte, nghĩa là đặt byte thấp trước(sử dụng trong các HĐH Windows) hoặc byte cao trước(thường sử dụng trong các HĐH Unix). Mỗi chuỗi ký tự Unicode(Unicode stream) được ghi dấu ở đầu bằng dấu thứ tự byte(BOM: Byte Order Mark) cho biết phải hoán chuyển thứ tự byte cho phù hợp khi hai hệ thống trao đổi dữ liệu với nhau, như giữa một trạm Windows và một server Unix chẳng hạn. 17
- Các dạng biến đổi Unicode (UTF: Unicode Transformation Format). Mỗi điểm mã của bảng mã Unicode căn bản được ký hiệu U+nnnn, trong đó nnnn là số thập lục phân trong khoảng 0000 đến FFFF. Các dạng biến đổi Unicode chính là các lược đồ mã hoá ký tự cho bảng ký tự Unicode, gán mỗi ký tự Unicode thành một dãy duy nhất các byte tuần tự hoá. UTF-8: là kết quả của dạng biến đổi Unicode tạo nên từ các đơn vị 8 bit. UTF-8 có chiều dài thay đổi: - 128 ký tự đầu tiên của Unicode từ điểm mã U+0000 đến U+007F, được mã hoá thành 1 byte. - Từ U+0080 đến U+07FF, được mã hoá thành hai byte. - Từ U+0800 đến U+FFFF, được mã hoá thành ba byte. - Từ U+100000 đến U+10FFFF(phần nới rộng của Unicode), được mã hoá thành bốn byte. UTF-16: là kết quả của dạng biến đổi Unicode tạo nên từ các đơn vị 16 bit. Dạng mã hoá mặc định của các ký tự Unicode căn bản là 16 bit, còn đối với phần Unicode nới rộng là các đơn vị 16 bit. UTF-16LE: là kết quả của dạng biến đổi Unicode tạo nên từ các đơn vị 16 bit, theo định dạng đầu cuối bé. UTF-16BE: là kết quả của dạng biến đổi Unicode tạo nên từ các đơn vị 16 bit, theo định dạng đầu cuối lớn. Như vậy có nhiều cách mã hoá trong Unicode nghĩa là nhiều cách biểu diễn(gán) một ký tự thành chuỗi nhị phân trong máy để xử lý. Một cách biểu diễn như vậy còn gọi là một ánh xạ ký tự(character map). Ta thấy cách mã hoá mặc định của Unicode là 16 bit, nhưng còn có cách mã hoá chỉ cần 8 bit(UTF-8) cho những ký tự ANSI. Có thể chuyển đổi mà không mất thời gian tìm kiếm giữa các dạng mã hoá của Unicode, từ UTF-8 sang UTF-16 và ngược lại. Dùng dạng mã hoá nào là tùy ngữ cảnh: dùng UTF- 8 lợi hơn khi đa số ký tự trong văn bản là chữ La tinh; UTF-16 lợi hơn khi đa số ký tự không phải là ký tự ANSI. Các cách mã hoá ngôn ngữ của Microsoft. Máy tính được phát minh và phát triển hoàn chỉnh ở Mỹ, nên bộ ký tự mã hoá hoàn chỉnh đầu tiên là của Mỹ và dĩ nhiên cho các ký tự, ký hiệu Anh-Mỹ, vốn gọi là ASCII(American Standard Code for Information Interchange) hay còn gọi là các ký tự ANSI. Bộ mã này có 128 ký tự: ngoài các ký tự tiếng Anh, ký tự số, các ký hiệu tiền tệ Anh Mỹ,..còn có 31 ký tự điều khiển các hệ thống ngoại vi. ASCII chỉ dùng 7 bit để mã hoá ký tự(27 = 128), bit cuối cùng (MSB) là bit giúp phát hiện lỗi khi truyền dữ liệu số. Dĩ nhiên bộ mã ASCII căn bản không đủ cho các ký tự của các quốc gia và các vùng địa chính trị khác. Do đó, phải đặt ra nhiều cách mã hoá ký tự như đã nói ở trên: - Dạng mã hoá ký tự một byte(SBCS) dùng 8 bit để mã hoá 256 ký tự khác nhau. Ví dụ, chuẩn ISO 646 dựa vào bộ mã ASCII và bổ sung thêm 1 bit, chứa được đủ các chữ cái của các thứ tiếng ở Tây Âu, còn gọi là mã La tinh 1(sau này là ISO 8859-1). Tổ chức ISO tiếp tục phát triển các bộ mã ký tự 8-bit mang tên ISO 8859-x cho các nước ở châu Âu. Sau đó là những phát triển cho các bộ mã 8-bit cho các nước khác trong đó có Việt nam. Ví dụ: TCVN 5712; CP 1258, ... Các bảng mã dạng SBCS luôn giống nhau ở chỗ, 128 ký tự đầu tiên của mọi bảng mã bao gồm tập ký tự ASCII chuẩn. Các ký tự từ điểm mã 128 đến 255 biểu diễn các ký tự bổ sung và thay đổi tùy tập hợp các tập ký tự diễn đạt cho bộ chữ viết (scripts) của một ngôn ngữ nào đó. 18
- - Mã hoá ký tự hai byte(DBCS) dùng cho các ngôn ngữ châu Á, sử dụng 8 đến 16 bit để mã hoá từng ký tự. Cùng lúc với máy vi tính được hoàn thiện và phổ cập là sự thống trị của Microsoft trên HĐH và các ứng dụng then chốt. Thị trường máy vi tính nhanh chóng mở rộng qua các châu lục khác, khiến Microsoft đã thừa kế các mã trên chuẩn ISO và các mã hoá bản địa để đặt ra cách mã hoá riêng của mình cho các tập ký tự tại những quốc gia “đáng để đầu tư” và kèm vào đó khá đầy đủ cơ sở dữ liệu các tính cách bản địa đi kèm. Chẳng hạn như các bảng mã(sau đây gọi là bảng mã CP): - CP 1252: cho Mỹ và Tây Âu. - CP 874: cho tiếng Thái. - CP 949: cho tiếng Hàn. - CP 932: cho tiéng Nhật. - CP 936: cho tiếng Hoa giản thể. CP 950: cho tiếng Hoa phồn thể(truyền thống). - CP 1258: cho tiếng Việt. - ... Một số tính cách bản địa có thể dùng chung một bảng mã CP. Ví dụ: Mỹ và các nước Tây Âu cùng sử dụng CP 1252. Do địa vị thống trị của Windows và các công cụ lập trình hỗ trợ ngôn ngữ bản địa Win32 API mà các bảng mã này dần dần được các hãng CNTT quốc tế các công nhận thành chuẩn thực tế(de facto), và được tích hợp vào nhiều hệ thống mã nguồn mở. Oracle hỗ trợ CP 1258, xem http://otn.oracle.com/products/oracle8i/pdf/817nls_fo.pdf IBM Lotus Notes hỗ trợ CP1258, xem http://www- 10.lotus.com/ldd/today.nsf/lookup/think_globally Quan hệ mật thiết giữa các bảng mã CP và bảng mã Unicode. 1- Có thể nói rằng các bảng mã CP và Unicode đều là dạng nới rộng của bảng mã ASCII chuẩn. Unicode nới rộng ASCII lên 16 bit. 128 điểm mã đầu tiên của Unicode(U+0000 đến U+007F) tương ứng với ISO 646. 256 điểm mã đầu tiên(U+0000 đến U+00FF) tương ứng với ISO 8859-1. Vì thế nếu 9 bit cao của một ký tự Unicode là zero, thì có thể coi đó đúng là bảng mã 7 bít ASCII, nên nhiều khi còn gọi là UTF-7. Tương tự, nếu byte cao là zero, thì có thể coi byte thấp đó chính là ký tự ASCII(nới rộng). Ngược lại, có thể chuyển bảng mã ASCII vào Unicode một cách đơn giản là thêm vào các số 0. Cách mã hoá này bảo toàn tính trong suốt của các ký tự ANSI để nhằm tương hợp với các hệ thống xử lý mã hoá 7 bit và 8 bit. Tuy rằng các HĐH hiện đại đều dùng mã hoá Unicode để xử lý bên trong hệ thống, thực chất vẫn là dưới dạng mã hoá 7 hoặc 8 bit. 2- Tương tự, có tương ứng một-một giữa một bảng mã CP với một tập con của bảng mã Unicode theo lược đồ định vị Unicode. Tập con đó bao gồm mọi ký tự được mã hoá của ngôn ngữ tương ứng với bảng mã CP, và được gọi là bảng mã Unicode của ngôn ngữ đó. Các HĐH và các ngôn ngữ lập trình đều hỗ trợ chuyển đổi giữa hai bảng mã này. Do đó, có thể nói rằng bảng mã CP 1258 là một biểu diễn 8 bit của bảng mã Unicode tổ hợp tiếng Việt và trong rất nhiều xử lý thực tế, người sử dụng không còn thấy sự phân biệt giữa hai bảng mã này, nên cũng có thể gọi tập con của Unicode tương ứng với CP 1258 là Unicode-1258 để phân biệt với các cách mã hoá tiếng Việt khác. Ta cũng tạm gọi tập con của bảng mã Unicode chứa các ký tự tiếng Việt được mã là 19
- Unicode-DS. Do đó có thể nói tập con của bảng mã Unicode chứa các ký tự của bảng mã TCVN 6909 là phần hợp của Unicode 1258 và Unicode DS. 3- Unicode có lẽ không phải là cách hiệu quả nhất trong vấn đề lưu trữ và chuyển văn bản(text), đặc biệt ở các quốc gia ở thuộc châu Mỹ và nhiều nơi ở châu Âu. Vì các phần mềm phát triển cho các nơi này thường chỉ cần 256, thậm chí 128 ký tự thôi. Ngay những quốc gia như Nhật Bản yêu cầu cách mã hoá hai byte, phần lớn tài liệu của họ cũng chỉ chứa các ký tự từ những tập ký tự 7 bit hoặc 8 bit thôi. Vả lại, các dữ liệu “di sản” của các nước có nền kinh tế tri thức phát triển mạnh còn quá nhiều như Nhật chẳng hạn, nên việc chuyển qua Unicode của Nhật vẫn thông qua con đường bảng mã CP, và hiện nay vẫn chủ yếu dùng bảng mã CP. Người lập trình quan tâm đến việc giảm thiểu bộ nhớ lưu trữ và tối ưu hoá thông lượng truyền dữ liệu thì luôn làm công việc chuyển đổi giữa bảng mã CP và Unicode. Việc chuyển đổi này thường xuất hiện “giữa cuộc” của chương trình, trước khi text được ghi hoặc gởi hoặc ngay sau khi nhận hoặc đọc text. Vì thế nhà lập trình thường tùy cơ tận dụng Unicode cho xử lý bên trong và mã CP để lưu trữ và truyền dũ liệu. Các ứng dụng trong Windows vẫn cho lưu dữ liệu dưới nhiều dạng mã hoá như Windows Vietnamese(chính là CP 1258), Unicode UTF-8, ...mà không trở ngại gì khi xử lý nhờ tính tương thích 1-1 như đã nêu ở trên. Hầu hết các ứng dụng hiện nay vẫn là non-Unicode, tức là được dịch dưới mode ANSI, ngay cả bộ phần mềm Office của MS cũng vậy. Vì thực tế các ngôn ngữ lập trình chỉ cần các ký tự ANSI 8 bit để viết các ứng dụng như vậy(các công cụ lập trình vẫn hoàn toàn bằng tiếng Anh!). Ví dụ nữa là các ký tự thuần Việt chỉ có 134 ký tự, có lẽ không cần sử dụng tới không gian mã quá lớn của Unicode(đến 65535 ký tự căn bản); nghĩa là có thể sử dụng một dạng mã hoá 8-bit, không cần đúng dạng mã hoá đến 16- bit; nhưng khi lưu trữ thì phải đưa về đúng một chuẩn mã hoá để còn có thể chuyển đổi đúng giữa các dạng mã hoá và gắn kết chặt chẽ được với tính cách bản địa, không thể “encoding” pha trộn được. Như vậy, cách lưu trữ tiếng Việt tiết kiệm nhất vẫn là ở dưới các dạng chuẩn CP 1258 hoặc “dạng nén” UTF-8. 4- HĐH và các ứng dụng xử lý đúng tính cách bản địa của văn bản theo một cách mã hoá chuẩn được HĐH hỗ trợ. Ví dụ, hiện nay Win9x(với MLP)/Me/2000/XP xử lý đúng tính cách bản địa tiếng Việt chỉ với các bảng mã CP 1258 và Unicode-1258. Các ký hiệu của một ngôn ngữ trong Unicode có thể không theo một thứ tự nhất định và không gắn liền với tính cách bản địa nếu không có thông tin về mã hoá. Do đó, lưu dữ liệu dưới một dạng mã hoá ký tự trong Unicode (UTF- 8, UTF-16, ...) chưa được HĐH hỗ trợ thì dữ liệu đó không có thông tin bản địa. Hiển thị ngôn ngữ bản địa. Hiển thị ngôn ngữ bản địa liên quan chặt chẽ đến các tính cách bản địa sau: - Ký tự bản địa: bao gồm các bộ chữ, bảng mã, .... - Chiều viết: theo dòng hay cột, từ trái qua phải hay từ phải qua trái, ... - Cách viết: bỏ dấu, sắp thứ tự trong văn bản, chấm câu, ... Các ứng dụng chạy dưới các HĐH hỗ trợ đa ngôn ngữ có thể đáp ứng tự động sự khác biệt giữa các tính cách bản địa bằng cách tham chiếu đến các “Bảng thông tin quốc gia (country information table)” và các công cụ lập trình qua locale ID(ký hiệu 20
- định danh tính cách bản địa của một ngôn ngữ). Ngoài ra người sử dụng cuối có thể chọn trực tiếp các thiết lập tùy chọn từ ngay HĐH. Việc hiển thị ký tự bản địa cũng liên quan chặt chẽ đến font chữ. Có thể hiểu font là cơ sở dữ liệu các ký hiệu đồ hoạ trừu tượng- gọi là dáng chữ(glyph), có thể vẽ ra trên một thiết bị xuất liệu tương thích như màn hình, máy in, máy vẽ. Một font không nhất thiết chứa mọi dáng chữ dành cho một bảng mã nào mà còn có thể chứa dáng chữ dùng chung cho nhiều bảng mã. Do font là csdl của dáng chữ, nên thông tin về font cũng cho một vài phương tiện để định dạng dáng chữ như bộ định dạng dáng chữ. Hiển thị font trên Unicode với TrueType font(TTF) lại dễ dàng hơn rất nhiều lúc hiển thị đa ngữ mà phải chuyển qua lại giữa các bảng mã như trước đây. Một font Unicode chứa các dáng chữ dùng cho nhiều vùng chữ của Unicode(ranges). Hơn nữa do chuyển đổi tương thích một-một giữa các bảng mã CP với các tập con tương ứng của Unicode mà có các font dùng chung cho một số bảng mã và các vùng chữ của Unicode. Do Windows NT/2000/XP hỗ trợ Unicode bản sinh nên hễ có font là nó hiển thị lên dễ dàng qua ứng dụng gọi, chứ không có “dùng loại HookAPI ...”nào cả. Bàn phím nhập ký tự bản địa. Nhập ký tự bản địa trong môi trường đa ngôn ngữ cần phải cho phép: - Chọn bàn phím bản địa, thể hiện được ký hiệu bản địa và đáp ứng yêu cầu hiển thị ngôn ngữ bản địa. - Phân biệt được trong một văn bản, chỗ nào là tiếng nước nào. HĐH lưu giữ thông tin bố trí bàn phím(keyboard layout) trong các bảng xác định phát sinh ký tự nào ra khi người sử dụng gõ một phím trên bàn phím. HĐH có thể kiểm soát bố trí bàn phím nào đang sử dụng cho người dùng nào và áp dụng nào tại bất kỳ thời điểm nào. Hiện nay viết một trình bố trí bàn phím(keyboard driver) theo thói quen NSD(Ví dụ: kiểu gõ Telex, VNI) bản địa là một chuyện hết sức dễ dàng. Tuy nhiên, Người sử dụng còn phải có được tiện ích chọn nhập tính cách bản địa(input locales), gắn liền với bàn phím bản địa đang sử dụng. Hỗ trợ ngôn ngữ bản địa và đa ngôn ngữ trong HĐH Windows NT/2000/XP. Windows(NT/2000/XP) dùng Unicode là cách mã hoá ký tự cơ bản, theo nghĩa mọi chuỗi ký tự bên trong hệ thống, đều được mã hoá theo Unicode. Windows cũng hỗ trợ cách mã hoá ANSI và các cách mã hoá của ISO, EBCDIC, Macintosh. Nó cũng chứa các bảng chuyển đổi cho các chuẩn UTF-7 và UTF-8, thường dùng để gởi dữ liệu dạng Unicode qua mạng, đặc biệt là qua Internet. Hỗ trợ ngôn ngữ bản địa (NLSAPI). Hỗ trợ ngôn ngữ bản địa(NLS: National Language Support) trong Windows NT bao gồm một tập các bảng trong hệ thống mà các ứng dụng có thể khai thác qua NLSAPI. Nhà lập trình có thể dùng các API cấp hệ thống để tạo ra mã chung để xử lý đúng việc nhập liệu, lưu trữ và hiển thị chung cho các ngôn ngữ. NLSAPI chứa các hàm để biến đổi chuỗi, truy tìm và chế tác thông tin về bảng mã, tìm kiếm và chế tác thông tin bản địa. Các API này liệt kê trong Bảng 1. Các hàm NLSAPI cho phép ứng dụng truy vấn hệ thống về các loại thông tin có thể thay đổi tùy theo ngôn ngữ, 21
CÓ THỂ BẠN MUỐN DOWNLOAD
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn