Chủ đề này có thể xem như một phần kế tiếp tự do của chủ đề "một phương pháp mã hoá tiếng Việt" từ năm 2010 [1].
Do việc mã hoá tiếng Việt triển khai ra có khá nhiều chi tiết nhỏ, mình quyết định để [1] tập trung trình bày giải pháp kỹ thuật cho vấn đề then chốt, là mã hoá một chữ Việt (ngôn ngữ nguồn là tập hợp các chữ Việt), còn các vấn đề "râu ria" xung quanh thì mở chủ đề mới. Chủ đề này dành cho việc trình bày giải pháp kỹ thuật cho 2 vấn đề của việc mã hoá một xâu Việt (ngôn ngữ nguồn là tập hợp các xâu có tiếng Việt).
Cần nói ngay, trong khi [1] lý thú, vì nội dung độc đáo, chủ đề này sẽ tẻ nhạt, vì nội dung tầm thường. Như lẽ thường tình, ở phần lớn sáng chế, tính độc đáo hay tầm thường không phải là từ khả năng của tác giả nhìn ra giải pháp, mà là nhìn ra vấn đề. Vấn đề của chữ Việt trong các định dạng Unicode thông thường là tốc độ; và khi xây dựng giải pháp cho nó, mình đã nhìn thấy (và đã giải) một loạt vấn đề khác, như việc ký âm phương ngữ và ngoại ngữ, mã hoá sách giáo khoa lớp vỡ lòng (dạy trẻ đánh vần), tính tương thích với định dạng xâu NUL-terminated (C-xâu), tính tương thích với các mã vốn có trước (ASCII, Unicode), thời gian tính toán hằng, vân vân. Do vấn đề nguyên thuỷ xem ra không có ai biết, những vấn đề phát sinh này, dĩ nhiên, không ai nhìn ra.
Tương phản với đó, trong mã của mình, mỗi chữ Việt được mã hoá bằng 16 bit, không có dấu cách và không phân biệt chữ hoa với chữ thường. Dễ thấy rằng nó có thông số cơ bản giống như chữ Hán trong định dạng UCS-2 (giống đến nỗi vô tình, nó thách thức ngôi vô địch của chữ Hán về hiệu quả trong công nghệ thông tin.) Cho nên vấn đề vốn không tồn tại ở chữ Hán mà lại tồn tại ở chữ Việt, là mã hoá dấu cách và chữ hoa, ai cũng nhìn ra.
Giải pháp cho cả hai vấn đề trên đều đã được nêu từ năm 2010. Giải pháp cho dấu cách được nêu bằng một ví dụ trong bài #9 của [1]. Giải pháp cho chữ hoa đã được nêu bằng một ví dụ trên một số diễn đàn công nghệ khác (nay đã ngừng hoạt động). Chủ đề này chỉ trình bày lại giải pháp. Một cách rành mạch hơn.
Vì sao mình phải mất thời gian mở chủ đề tẻ nhạt này, để trình bày giải pháp tầm thường, cho những vấn đề ai cũng thấy (và cũng giải được) như thế?
Mục đích của mình ở đây, cũng như ở [1], là bảo vệ người dùng. Mình công bố mà không đăng ký sáng chế để ai cũng có thể dùng tự do và miễn phí. Nếu mình không mở chủ đề này, ai đó có thể nhanh tay đăng ký những kỹ thuật này, vô tình tước đoạt quyền sử dụng tự do và miễn phí chính đáng của mọi người khác. Xin lưu ý rằng những kỹ thuật này khi áp dụng cho những định dạng khác, như ASCII hay UTF-8, không thể được bảo hộ (vì bằng sáng chế, nếu có, cũng đã hết hạn từ lâu), nhưng nếu áp dụng cho mã của mình thì vẫn có thể được bảo hộ. Mình muốn ngăn ngừa việc đăng ký sáng chế như thế và vô hiệu hoá sự bảo hộ [bất chính] nếu chẳng may bằng sáng chế như thế được cấp kể từ năm 2010 đến bây giờ hay trong tương lai. Ngõ hầu giúp người dùng tránh hoặc giảm chi phí bất ngờ và khó chịu cho một việc không đáng có, là tranh chấp quyền tác giả.
Việc cấp bằng cho một người về sáng chế của người khác (do sự thiếu hiểu biết hoặc thiếu công minh của cơ quan cấp bằng) là chuyện thường. Đơn cử, một cách tính giá trị tuyệt đối của một số nguyên trong thời gian hằng (nghĩa là không phân nhánh trong mã máy), chỉ là 1 dòng mã nguồn thôi, được cấp bằng sáng chế năm 2000 cho một công ty Hoa Kỳ và mãi 6 năm sau, người ta mới phát hiện ra bằng sáng chế ấy thực ra vô hiệu vì cách ấy đã được công bố từ 10 năm trước bởi một giáo sư Đan Mạch [2].
Đọc cho vui, không có ý so sánh, ai đã phát minh ra phép tính tích phân [xác định], Newton hay Leibniz, đã từng là một chủ đề tranh cãi nảy lửa giữa các học giả Anh và Đức, với những cáo buộc gay gắt và thoá mạ nặng nề [3]. Mãi đến gần đây các nhà sử học mới tìm được đủ bằng chứng thuyết phục rằng 2 ông đã phát minh ra nó một cách độc lập với nhau.
Tham chiếu
[1] Ada: Một phương pháp mã hoá tiếng Việt. 2010.
[2] Anderson S E: Bit Twiddling Hacks. 2005.
[3] Wikipedia: Leibniz–Newton calculus controversy.
- - - Nội dung đã được cập nhật ngày 21-10-2021 lúc 03:09 PM - - -
OK, chuyện dài hoá ngắn, chuyện ngắn hoá không. Trong bài #9 chủ đề [1] từ năm 2010, mình đã nêu một ví dụ 4 octet (tức 32 bit, tức 4 byte, theo cách hiểu thông thường về "byte") và đã nói nó là mã của từ Ngựa Gióng, hay ngựa gióng, NGỰA GIÓNG, ngỰA giÓng, v.v. hiểu sao cũng được.
Giải thích rõ ra, câu ấy nghĩa là 4 octet đấy đã ngầm mã hoá dấu cách và không mã hoá dạng chữ (hoa hay thường). Bởi vì ngựa Gióng, ngựa gióng, NGỰA GIÓNG đều gồm 2 chữ + 1 dấu cách và mỗi chữ, chưa biết dạng viết hoa hay viết thường, đều đã chiếm 2 octet mất rồi.
Do không phải ai cũng hiểu rõ "chữ" là gì và thế nào là "mỗi chữ được mã hoá bằng 2 octet", xin nêu vài ví dụ lấy từ những trường hợp "ngóc ngách" của chữ Việt. Ba từ vắcxin, kilôgam, acêtylen có 1 chữ, ba từ vắc-xin, ki-lô-gam, a-cê-ty-len là những từ có nhiều chữ, còn ngựa:Gióng, ngựa-Gióng, ngựa_Gióng, ngựa0gióng, ehm, là những "từ" có hai chữ. Ba từ đầu sẽ không được mã hoá bởi vì một chữ có nhiều âm tiết không thể mã hoá bằng 2 octet. Những từ còn lại đều mã hoá được (và sẽ được mã hoá) bởi vì mỗi chữ là một âm tiết Việt, vốn có thể mã hoá bằng 2 octet. Vì lẽ đó, trong suốt chủ đề [1] và cả chủ đề này, vắcxin, kilôgam,... không được xem là chữ Việt. Chúng là ngoại ngữ giống như bao ngôn ngữ tự nhiên (Anh, Nga, Lào, Miên) và nhân tạo (Fortran, Cobol, Ada, C++) có thể xuất hiện trong dữ liệu đầu vào.
Ngoại trừ một số ít trường hợp, giữa hai chữ (hoặc từ) của cùng một ngôn ngữ hay của hai ngôn ngữ khác nhau cần phải có ít nhất một dấu ngăn cách. Chữ Việt không thuộc về ngoại lệ: giữa hai chữ Việt phải có ít nhất một dấu ngăn cách (1). Xin nói thêm, cơ bản, dấu cách (separator) là một ký tự không in được, như dấu trắng (SP), HT, VT, CR, LF, FF, còn dấu ngăn (delimiter) là một ký tự in được mà không phải là chữ cái, chữ số, ký hiệu toán học hay biểu tượng khác, thí dụ, dấu chấm, phảy, nháy đơn, mở ngoặc đơn và đóng ngoặc đơn. Phân loại ký hiệu tuy nhiên rất phức tạp. Nếu hỏi mình, chẳng hạn, dấu tsheg (U+F0B) vốn dùng trong tiếng Dzongkha (một ngôn ngữ ở Pakistan) để phân cách các âm tiết là dấu ngăn hay dấu cách, thì mình chịu chết
. Cho nên thôi, làm rõ các khái niệm một cách vừa đủ thôi. Và mình chỉ nói về các dấu ngăn cách một cách chung chung mà thôi.
Với các khái niệm đã được làm rõ như trên, phương pháp mã hoá dấu cách của mình, phát biểu một cách chính xác như sau.
- Nếu chen giữa hai chữ [Việt] chỉ có đúng 1 dấu trắng, thì dấu trắng ấy được mã hoá ngầm.
Nhắc lại, ngựa gióng là ví dụ.
Mọi xâu con khác gồm toàn các dấu ngăn cách chen giữa hai chữ Việt đều được mã hoá tường minh. Ví dụ, nhiều dấu trắng; 1 hoặc nhiều dấu trắng theo sau một dấu chấm, phảy, hai chấm; 1 dấu xuống hàng, dấu sang trang, dấu gạch nối, dấu nháy đơn, đều được mã hoá tường minh. Nhắc lại [1], một dấu ngăn cách được mã hoá tường minh là được sao chép "nguyên xi" (nghĩa là "mã hoá" thành bản thân) vào bản mã.
Phương pháp của mình im lặng về dấu trắng giữa một chữ Việt và một chữ (hoặc từ) của ngôn ngữ khác. Bởi vì mình không định nghĩa được thế nào là chữ (từ) của ngôn ngữ khác. Ví dụ, với câu riêng mặt trời chỉ có 1 mà thôi, hai dấu trắng tiếp giáp số "1" được mã hoá ngầm hay tường minh là tuỳ ý người dùng (2). Tương tự, với câu một octet luôn có tám bit nhưng một byte thì không, việc mã hoá dấu trắng đi trước và theo sau từ octet, bit, byte cũng thế.
______________________
(1) Trong câu này, một chữ số cũng là một dấu ngăn cách. Để tách chữ Việt chính xác và hiệu quả, mọi ký tự ASCII có mã số nhỏ hơn 64 (kể cả chữ số) đều được xem là một dấu ngăn cách.
(2) Ai muốn mã hoá ngầm trong trường hợp này nên suy tính làm cách nào mã hoá được cả hai xâu ngựa 0 gióng và ngựa0gióng.
- - - Nội dung đã được cập nhật ngày 22-10-2021 lúc 07:21 AM - - -
Để phân biệt chữ hoa với chữ thường, các chữ viết hoa nói chung được chỉ định bằng các mã định dạng chèn vào bản mã. Xâu chữ có các chữ viết hoa được mã hoá bằng một mã định dạng mở đầu (dẫn trước) chế độ viết hoa và, tuỳ theo chế độ, có thể một mã định dạng kết thúc (theo sau). Xâu chữ thường không có mã định dạng.
Phương pháp của mình có 2 chế độ mã hoá, dùng cho hai dạng chữ hoa thông dụng: viết hoa toàn chữ (như GIÓNG) và viết hoa đầu chữ (như Gióng). Đó là chế độ viết hoa toàn chữ ở mọi chữ và chế độ viết hoa đầu chữ ở vài chữ. Chi tiết như sau.
- Khi một đoạn mã chịu tác động chồng chất của nhiều mã định dạng, chế độ chỉ có mã định dạng mở đầu chồng lên (override) (có ưu tiên cao hơn) chế độ có cả mã định dạng mở đầu lẫn kết thúc.
- Một xâu con gồm toàn các chữ viết hoa toàn chữ được bao bọc giữa hai mã định dạng mở đầu và kết thúc, mỗi mã là 1 octet.
- Một xâu con có một vài chữ viết hoa đầu chữ được dẫn trước bằng mã định dạng gồm 2 octet: mở đầu và tham số. Nó không có mã định dạng kết thúc. (Nói cách khác, nó tự kết thúc.)
- Tham số là một xâu 8 bit chỉ rõ chữ nào được viết hoa đầu chữ. Mỗi bit lần lượt chỉ định dạng cho một chữ. Bit đầu (bit 7, MSB) chỉ định dạng cho chữ đầu, bit thứ hai (bit 6) chỉ định dạng cho chữ thứ hai, và cứ thế đến bit cuối (bit 0, LSB) chỉ định dạng cho chữ cuối, tức chữ thứ tám. Đặc biệt, bit đầu luôn có giá trị 1 (nghĩa là chữ đầu luôn viết hoa đầu chữ.)
Trong đó, octet biểu thị "bắt đầu viết hoa toàn chữ", "kết thúc viết hoa toàn chữ", "chọn lọc viết hoa đầu chữ" lần lượt là dấu SO (Shift Out), SI (Shift In), DLE (Data Link Escape), ba ký tự điều khiển của mã ASCII.
Ví dụ, xâu CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM Độc lập - Tự do - Hạnh phúc có thể mã hoá bằng
Code:
SO cộng hoà xã hội chủ nghĩa việt nam SI DLE 10101000 độc lập - tự do - hạnh phúc
hoặc
Code:
SO cộng hoà xã hội chủ nghĩa việt nam DLE 10101000 độc lập - tự do - hạnh phúc SI
hoặc nhiều cách khác.
Phương pháp của mình im lặng về xâu có những chữ có chữ cái hoa dạng khác, như GiónG, gióNG, gIÓng. Bởi vì mình không định nghĩa được những dạng ấy. Những chữ như thế có mã hoá hay không và, nếu có, bằng cách nào, là tuỳ ý người dùng.
Kết thúc chủ đề này, xin lưu ý về khác biệt giữa 2 phương pháp mã hoá dấu cách và mã hoá chữ hoa đã chỉ rõ trên. Để đảm bảo tính tương thích tối thiểu giữa các cài đặt, phương pháp mã hoá dấu cách là bắt buộc, phương pháp mã hoá chữ hoa là tuỳ chọn. Nghĩa là người dùng ở mọi "level" của sự tuân thủ (kể cả "level 0") đều phải hiểu định dạng mã hoá dấu cách, nhưng một người dùng ở "level 1" mới cần hiểu định dạng mã hoá chữ hoa. Một lần nữa, xin nhắc lại ví dụ từ năm 2010 [1], ngựa Gióng có thể hiểu là ngựa gióng hay NGỰA GIÓNG, nhưng không bao giờ được hiểu là ngựaGióng.