Một thắc mắc với font TCVN3

Liên hệ QC

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,935
Tôi có 1 thắc mắc mà không biết đưa bài vào box này có hợp lý không... Nếu không đúng xin nhờ Mod chuyển bài giúp (tuy nhiên câu hỏi cũng có liên quan 1 chút đến định dang)
--------------------------
Theo như tôi biết thì font TCVN3 là font 1 byte, bao gồm 256 ký tự, vì thế mà không đủ "chổ chứa" cho cả chữ thưởng và chữ HOA
Vì lẽ đó người ta phải phân ra thành 2 file font, 1 file chữ thường và 1 file chữ HOA
Với font Unicode hoặc VNI, khi ta muốn gõ chữ HOA, đơn giản chỉ cần bấm phím Shift (hoặc Caps lock)
Còn với font TCVN3, tôi có 1 thắc mắc thế này: Không biết trong quá trình soạn thảo văn bản bằng font TCVN3, khi các bạn muốn chuyển chử thường sang chữ HOA hoặc ngược lại thì các bạn làm thế nào nhỉ? ---> Chẳng lẽ phải đổi font sao?
 
Chữ hoa thì cũng nhấn Shift ndu à, kể cả nguyên âm không dấu và phụ âm bao gồm cả Đ. Chỉ những nguyên âm hoa có dấu mới phải đổi font thôi.
 
Lần chỉnh sửa cuối:
Chữ hoa thì cũng nhấn Shift ndu à, kể cả nguyên âm không dấu và phụ âm bao gồm cả Đ. Chỉ những nguyên âm hoa có dấu mới phải đổi font thôi.
Ví dụ em gõ chữ PHẠM THẾ MỸ thì phải đổi font, có phải không sư phụ? (khó khăn quá nhỉ) ---> Vậy hóa ra trong quá trình soạn thảo người ta phải đổi font liên tục sao trời?
 
Phạm Thành Mỹ thì không cần đổi font, nhưng PHẠM THÀNH MỸ thì phải đổi font.
Đường Đặng văn Ngữ thì không cần đổii font, nhưng Đường ĐẶNG VĂN NGỮ thì phải đổi font cho riêng cái tên in hoa.
Đây là điều tệ hại lớn nhất làm cho cá nhân tôi ghét font ABC đến thế.
 
Nói thêm, Font ABC còn 1 nhược điểm mà font Unicode cũng bị, là dùng hàm UPPER() của Excel, không chuyển được các chữ có dấu:
- Nguyên âm có dấu của ABC bị biến dạng khi dùng UPPER(), hết đọc được luôn.
- nguyên âm có dấu của Unicode còn nguyên chữ thường nhưng còn đọc được.

Trong khi đó font Vni-xxx thì xài UPPER ngon lành.

Hình như nguyên nhân là Excel cộng thêm 1 tham số vào character code của chữ thường để chuyển thành chữ in. Font ABC và Unicode không theo quy luật đó nên sai, Font Vni-xxx theo quy luật nên đúng.
 
Đương nhiên là phải đổi font đối với các ký tự có dấu mà hiển thị đủ trong 1 byte. Cái này cần gì phải nghĩ nhỉ. Định nghĩa font 1 byte là thế mà.

Cũng với lý do trên, hàm Upper hiển nhiên là ko đổi ứ thành Ứ được rồi.

Người ta gọi là font hỗ trợ TCVN3 chứ ko gọi là font ABC (Ví du font VK Sans Serif là font theo chuẩn TCVN3 nhưng ko đi kèm với bộ gõ ABC mà với bộ gõ VietKey), chỉ có bộ gõ ABC của Quách Tuấn Ngọc thôi và các font .vnXXX đi kèm theo là do bác QTN tạo ra, nhưng dùng chuẩn từ thì ko gọi là font ABC. Cần phải phân biệt và dùng chính xác từ của Fonts, Bảng mã, Kiểu gõ, và Bộ gõ (phần mềm)
 
Đương nhiên là phải đổi font đối với các ký tự có dấu mà hiển thị đủ trong 1 byte. Cái này cần gì phải nghĩ nhỉ. Định nghĩa font 1 byte là thế mà.

Cái này chắc anh Hải nói theo quan điểm của người từng quen với font ABC (Hình như là cả khu vực miền Bắc quen với loại font này, trong Nam chẳng ai sài) nên mới nói thế. Chứ thời chưa có font 2 byte trong Nam sài font VNI 1byte và 2 ký tự cho những chữ có dấu, mọi thứ có thể dùng upper lower (Excel) và change case (word) bình thường. Và trong Nam chuyện đổi font cho việc đổi case của font ABC là chuyện quái dị.
 
Định nghĩa font 1 byte là thế mà.

Đọc thật kỹ, tôi viết ở trên là font 1 byte (tên bảng mã là gì cũng được nhưng người ta gọi là font 1 byte) chứ ko phải là font 2 bytes. Và với fonts 1 byte thì phải thế.

Mình ko nói theo quan điểm "font ABC" (vừa ở trên mình nói là ko nên nói "fonts ABC" rồi mà) mà mình nói theo KHOA HỌC. Đã là font hỗ trợ TCVN3 tức là font 1 byte. Mà font 1 byte tức là sẽ có 1 số ký tự ko lên chữ hoa được vì phần chữ thì nằm ở byte 1, phần dấu nằm ở byte thứ 2. Và vì thế ko có cách nào khác ngoài cách đổi sang Font H. Tôi ko bao giờ có khái niệm nói theo "quan điểm" vùng miền hay thói quen gì đâu nhé, tôi nói là dựa trên nguyên lý của ... IT, của CNTT, của kỹ thuật, của Logic, của byte, của bit, của câu hỏi tác giả, của v.v... :-=

Ở đây bác Tuấn hỏi về điều rất cụ thể là font TCVN3 (tức font hỗ trợ bảng mã TCVN3 - nói thế mới chính xác). Chứ bác Tuấn ko hỏi về fonts hỗ trợ VNI Windows, Unicode hay bảng mã khác.

15 năm trước kia hai2hai cũng phân biệt được sự khác biệt TCVN3 là 1 byte và VNI Windows là 2 bytes rồi, và chuyện "phía nam" thì sài VNI, còn phía bắc (đầu não cơ quan chính trị) thì sài TCVN3 vì người phát triển ở gần trung tâm đầu não nên các cụ quyết định cái đó mới là chính thức trong các CQ nhà nước. Sau này thì thay đổi sang bảng mã là UNICODE (hồi đầu còn tranh cãi nhau mãi chuyện "dựng sẵn" hay "tổ hợp" nữa cơ) nhưng các cụ đã quen rồi, hàng triệu văn bản của các cơ quan nhà nước trước kia đã TCVN3 cả rồi

Còn nhiều thứ quái dị hơn nhiều. Ví dụ gọi 1 tá = 10 cái :p
 
Lần chỉnh sửa cuối:
Hừ hừ, thấy hay, cho phép em lạm bàn tẹo!
Thật ra thì ai cũng đúng cả nhưng mà iem lại thấy đúng là vì sự quen dùng còn nếu theo đúng khoa học thì có nhẽ phải xem lại nhé!
VNI là 2 bytes đúng vì cần 2 bytes để lưu trữ một ký tự đại diện nguyên âm của tiếng Việt nhưng đó chỉ là sự ghép cơ học có nguyên tắc tương đối khoa học một chút thôi ví dụ:
aù = á aø = à aû = ả aõ = ã aï = ạ AÙ = Á AØ = À AÛ = Ả AÕ = Ã AÏ = Ạ Còn để hiển thị ra chữ dạng tiếng Việt thì nó viện ra bộ phông VNI, một số bảng mã khác như BK hcm .... rồi viqr cũng đều cùng nhóm đó.
Trước đây tôi có tham gia nhóm vẽ graph vector cho một số phông chữ nôm và bản thân thì cũng đã từng vọc vạch thiết kế lại biểu tượng của Standard Chartered Bank vào mã của chữ hiển thị dấu đồng Euro đối với phông .Vntime cho tiện sử dụng trong bộ chứng từ của cơ quan. Ngoài ra cũng sửa nhiều ký tự khác nữa.
Thực ra thì phông chữ giống như một thứ lăng kính và ta thích nó hiển thị thành chữ gì thì đi sửa phông chữ là được!
(tất nhiên là xin nói theo góc độ nông dân một tẹo để cho dễ hiểu thui ạ).
(Thêm chút, tại sao khi dùng ucase của vni lại ngon trong khi tcvn lại không cho kết quả ngon là vì cách thiết kế bộ mã của vni khá khoa học đấy, trong khi tcvn3 thì nó không có đủ chỗ để chứa hết 134 mã nguyên âm của tiếng việt vì thế một số nguyên âm có dấu chữ hoa không tồn tại bên cạnh việc sự hạn chế của 256 ký tự không cho phép đặt nguyên âm vào đúng vị trí để hàm ucase, lcase chạy đúng).
Xin có thiển ý như thế, có gì iem xin viết tiếp sau bữa cơm ạ.
Có lẽ đây là bài viết tương đối rõ về bộ ký tự và phông chữ để các bạn tham khảo
http://www.microsoft.com/typography/unicode/cs.htm
Kèm theo bài là bản sửa đổi phông .VnTime đã được đổi tên font thành Test font và ký tự mã 49 (số 1) được đổi thành chữ GPE. (Các bạn tải file này về, giải nén và bỏ file ttf vô thư mục C:\windows\fonts, bật Excel lên gõ số 1 và đổi phông sang Test font)
 

File đính kèm

  • TEST.rar
    27.2 KB · Đọc: 48
Lần chỉnh sửa cuối:
Quả thật từ trước đến giờ vẫn xài font nhưng còn lờ mờ về vấn đề 1 byte, 2 byte này lắm (mà tin chắc vẫn còn rất nhiều người lờ mờ như tôi)
Tình cờ mấy hôm nay nghiên cứu về font và có 1 vài phát hiện khiến cho mình võ ra được nhiều thứ ---> Nhất là khi được nghe ý kiến của các cao thủ (lại càng cảm thấy mình thật NGU)
Cảm ơn tất cả mọi người đã quan tâm đến topic này ---> Mong có 1 ngày khi nghiên cứu về font, ngu chổ nào nữa lại nhờ các cao thủ giúp tiếp
Chân thành cảm ơn!

 
Mọi người có thể dùng FontCreator mà sửa font theo ý muốn. Copy từ font này sang font kia rất dễ ràng.
 
Sẵn nói thêm 1 tí:

- Cái hình dạng ký tự thể hiện lên màn hình, đó là font
- Cùng 1 ký tự nhưng mang code bao nhiêu, đó là bảng mã (TCVN3, Unicode, VNI For Win, ...). Thí dụ ký tự Ø trong bảng mã Unicode là 216, bảng mã VNI là 222, trong bảng mã TCVN3 không có.
- Làm thế nào để gõ bàn phím ra ký tự không có trên bàn phím, là kiểu gõ(Telex, VNI)
- Phần mềm hỗ trợ các kiểu gõ, là tạo ra bộ gõ.

1. Nói về Bảng mã:

- Bảng mã 1 byte, là bảng mã 256 ký tự: 1 byte = 8 bit, 2^8 = 256
Thuộc loại 1 byte là bảng mã TCVN3, bảng mã VNI For Win, ...
- Bảng mã 2 byte, là bảng mã 65536 ký tự: 2 byte = 16 bit, 2^16 = 65536
Thuộc loại 2 byte là bảng mã Unicode

2. Nói về tính chất bảng mã:

- Bảng mã Unicode dùng 16 bit để thể hiện 1 ký tự bất kỳ, Len ("a") = Len("ầ") = 1
- Bảng mã TCVN3 dùng 8 bit để thể hiện 1 ký tự kể cả ký tự có dấu. Vì thế 256 ký tự không đủ liệt kê hết mọi ký tự, và phải đổi Font cho chữ hoa. Khi dùng font chữ hoa, không cần nhấn Shift và không cần nhấn Capslock.
- Bảng mã VNI dùng 1 byte (8 bit) để thể hiện 1 ký tự không dấu, và dùng 2 byte, mỗi byte 8 bit để thể hiện 2 ký tự cho các chữ cái có dấu: 1 byte cho ký tự không dấu và 1 byte cho bản thân cái dấu.
Cho nên Len("a") =1 nhưng Len("à") = 2

3. Nói về Upper của Excel:

Hàm Upper của Excel tương đương với:

Upper(<kytu>) = Char(Code(<Kytu>)-32)

- Bảng mã TCVN3 chữ thường không có chữ nguyên âm có dấu in hoa, nên trong cùng font chữ thường, Code(<Kytu>) - 32 không ra ký tự mong muốn là chữ hoa của(<kytu>)
- Bảng mã Unicode: Rất nhiều các ký tự chữ nguyên âm có dấu mang số hiệu (AscW) lớn hơn 256, khi dùng hàm code thì sẽ ra 63. nghĩa là rất nhiều ký tự có code 63. Mà Excel tính hàm Code gặp 63 là để nguyên.
- Bảng mã VNI: Do dùng 2 ký tự để thể hiện 1 chữ nguyên âm có dấu, nên Upper(<kytu>) là Upper 2 ký tự: 1 ký tự chữ và 1 ký tự dấu. Kết quả là 1 chữ hoa không dấu và 1 dấu giống y vậy mà nằm cao hơn.
Người viết ra bảng mã VNI đã áp dụng đúng nguyên tắc trừ 32 để cho chữ hoa có code là code của chữ thường trừ 32, và, code của dấu cao bằng code của dấu thấp trừ 32.

Hậu quả xấu của việc dùng 2 ký tự cho 1 chữ nguyên âm có dấu của VNI:

Khi đánh chữ hoa có dấu đầu câu thường bị tình trạng chữ thì cao, dấu thì thấp đè lên chữ. Thí dụ Ông, Ống, Ân, Ẩn, ...
Đó là do Word, Excel, ... tự động sửa lỗi typing: AutoCorrect: Correct TWo INitial CApitals
nghĩa là hễ thấy 2 ký tự hoa đi chung với những ký tự thường thì lower bớt 1. Mà dấu của chữ hoa, là 1 ký tự hoa! Lower xuống thì nó nằm dưới thấp đè lên chữ!
Chỉ cần bỏ chọn mục này trong AutoCorrect trong Word là OK cho cả Word lẫn Excel.

File kèm theo minh họa hiệu số char code của cả dấu và chữ cái thường và in, font VNI thì luôn bằng 32, font Unicode thì lung tung, rất nhiều hiệu bằng không. Font TCVN3 thì chẳng có cùng lúc Upper và lower để mà tính hiệu.
 

File đính kèm

  • MinhhoaFontUpper.xls
    53 KB · Đọc: 24
Lần chỉnh sửa cuối:
Tiếp theo:


4. Nói về kiểu gõ:


- Kiểu gõ Telex là kiểu gõ dùng những chữ cái không dùng trong tiếng Việt như j, f, w, hoặc dùng ứng dụng quy luật tiếng Việt (không có aa, ee, dd ..., không có s giữa từ hoặc cuối từ) để tạo sự khác biệt khi gõ chữ có dấu.

- Kiểu gõ VNI là dùng các phím số từ 1 đến 9 để thêm dấu thanh, dấu mũ và dấu gạch ngang của đ.

5. Nói về bộ gõ:

Các phần mềm tạo bộ gõ đều phải sử dụng bộ nhớ clipboard.
Khi ta gõ 1 phát vào bàn phím, ký tự đó được lưu lại trong bộ nhớ clipboard.
Khi ta gõ phát thứ 2 và thứ 3, PM phải nối 2 hoặc 3 ký tự đó lại, so sánh với 1 list những nhóm ký tự đã định nghĩa:
Thí dụ:
- nếu aa hoặc a6 thì xoá ký tự a thứ nhất trên màn hình và thay bằng ký tự â trong bảng mã tương ứng.
- nếu aas hoặc a61 thì xoá ký tự â trên màn hình và thay bằng ký tự ấ.
- ...


Hệ quả:


Sử dụng bộ nhớ clipboard và cho hiện lên màn hình, đối với hệ điều hành thì tương tự như là copy/ cut và paste. Nên trong Word ta thường bị lỗi ký tự có dấu bị cách rời ra 1 khoảng trắng, Vì trong option của word có 1 chọn lựa Smart cut and paste, trong đó có mục con là Adjust sentense and word spacing Automatically.
Nghĩa là khi paste văn bản từ clipboard vào, gặp 1 ký tự có dấu, Word cho rằng đó là ký tự đầu từ hoặc đầu câu, và tách ra khỏi phần trước của từ thí dụ như "h ệ th ống"

Ai bị lỗi này vào Option của Word sửa lại, bỏ dấu check trong mục Adjust sentense and word spacing Automatically là OK
 
Lần chỉnh sửa cuối:
Các phần mềm tạo bộ gõ đều phải sử dụng bộ nhớ clipboard.

Chổ này cần bổ sung một tí. Không phải tất cả các phần mềm bộ gõ đều dùng Clipboard. Unikey có tùy chọn nếu bạn dùng clipboard hay không. Và mặc định là không. Thế nên dùng Unikey ít phải suy nghĩ hơn một số phần mềm bộ gõ khác.
 
Mọi người có thể dùng FontCreator mà sửa font theo ý muốn. Copy từ font này sang font kia rất dễ ràng.

Đã dùng thử FontCreator nhưng bản Home Edition có giá $79.00(US) và Professional Edition giá $199.00(US). Có soft nào free không bác?
----------
Hôm nay mới phát hiện ra bác sai chính tả.:-=
 
Chổ này cần bổ sung một tí. Không phải tất cả các phần mềm bộ gõ đều dùng Clipboard. Unikey có tùy chọn nếu bạn dùng clipboard hay không.
Riêng chỗ này mình cũng chưa hiểu, nếu không dùng clipboard thì Unikey lấy từ đâu ký tự trước đó và ký tự vừa đánh để ghép lại, và để so sánh với những nhóm ký tự đã định nghĩa?
 
Lần chỉnh sửa cuối:
Riêng chỗ này mình cũng chưa hiểu, nếu không dùng clipboard thì Unikey dùng cái gì để ghép nối lại ký tự trước đó và ký tự vừa đánh, để so sánh với những nhóm ký tự đã định nghĩa?
Cái này thì em không biết.
Nhưng em nghĩ Unikey hoàn toàn có thể đòi hỏi windows cấp phát cho mình một ô nhớ nào đó trong Ram (hoặc ổ cứng) để lưu chứ đâu nhất thiết phải phụ thuộc vào Clipboard.
 
Tôi cũng đã tìm hiểu về font để viết các hàm chuyển mã và đã rút ra vài vấn đề về về font:
- Nguyên âm, phụ âm latin có 26 chữ cái.
- Nguyên âm, phụ âm tiếng Việt kể cả latin (a, ă, â, b, c, d, đ, ... , w, x, y, z) đến 33 chữ cái trong đó có 12 nguyên âm (a, ă, â, e, ê, i, o, ô, ơ, u, ư, y) và 21 phụ âm (b, c, đ, f, ..., w, x, z). Mỗi nguyên âm kèm thêm 5 dấu thanh nên bảng mã tiếng Việt :
21 phụ âm + 12 nguyên âm + (12 nguyên âm * 5 dấu thanh) = 21+12+60=93 ký tự. Chữ hoa và chữ thường thành 93*2=186 ký tự. Nếu bỏ đi các chữ cái thuần latin thì còn 186-26*2=186-52=134

- ASCII dành chỗ cho 126 ký tự đầu (1>126) cho các phím điều khiển, chữ số, chữ cái latin hoa thường, các ký tự khác trên bàn phím, còn lại 255-126=129

1. Hàm PROPER : (như ptm0412 đã viết). Chỉ đơn giản là - 32 cho mã để thành chữ hoa. Điều này không đúng với các bảng mã tiếng Việt 1 byte và Unicode.
2. Tại sao bảng mã 2 byte tiếng Việt (VNI Windows) thì hàm PROPER đúng còn bảng mã 1 byle (TCVN3 ABC) thì sai ?
- Bảng mã 2 byte kết hợp 2 ký tự (1 ký tự nguyên âm và 1 ký tự dấu thanh). Vừa dấu thanh chữ hoa, chữ thường chỉ cần 6*2=12 ký tự dấu thanh nên đủ chổ trong ASCII
Ví dụ : ấ gồm ký tự a (97) và dấu ^ / (225), dùng hàm PROPER thì thành Ấ gồm ký tự A (97-32=65) và dấu ^ / (1225-32=93)
- Bảng mã 1 byte (TCVN3 - ABC) vì 1 ký tự không dấu, có dấu độc lập nên không đủ chỗ trong ASCII (cần đến 134 ký tự trong khi ASCII chỉ còn 129 ký tự)
3. Tại sao Unicode không sắp xếp tiếng Việt tiếng Việt vào 1 khu vực nào đó theo nguyên tắc ±32 để dùng đúng với hàm PROPER ?
Tôi có đọc 1 tài liệu giải thích vấn đề này (giờ không nhớ nguồn ở đâu) như sau : do bảng mã Unicode là bảng mã đa ngôn ngữ, nên có một số ký tự được nhiều ngôn ngữ dùng chung (ví dụ é là ký tự chung của Việt, Pháp, ...) nên nếu đúng với ngôn ngữ này thì sai với ngôn ngữ nọ. Nên Unicode là như vậy. Còn việc phát triển, xử lý như thế nào là tùy từng quốc gia, từng ngôn ngữ.

Đây là nhận xét cá nhân, có thể còn nhiều điều không đúng. các bạn góp ý thêm !
 
Lần chỉnh sửa cuối:
2. Tại sao bảng mã 2 byte tiếng Việt (VNI Windows) thì hàm PROPER đúng còn bảng mã 1 byle (TCVN3 ABC) thì sai ?
- Bảng mã 2 byte kết hợp 2 ký tự (1 ký tự nguyên âm và 1 ký tự dấu thanh). Vừa dấu thanh chữ hoa, chữ thường chỉ cần 6*2=12 ký tự dấu thanh nên đủ chổ trong ASCII
Ví dụ : ấ gồm ký tự a (97) và dấu ^ / (225), dùng hàm PROPER thì thành Ấ gồm ký tự A (97-32=65) và dấu ^ / (225-32=193)
......

Theo tôi thì ngay cả VNI cũng không đúng.
Bởi vì dấu ^/ của chữ ấ (thường) thì có vị trí thấp hơn dấu ^/ của chữ Ấ (hoa) cho nên PROPER sẽ cho chữ Ấ rất kỳ: chữ A (hoa) nhưng dấu ^/ thì nằm thấp, dính vào chữ A.
Nhưng nếu gõ vào từ bàn phím thì bộ gõ sẽ xử lý để cho ra chữ Ấ đúng.
Như vậy hàm PROPER chỉ xử lý những ký tự là chữ cái latin mà thôi.
Nên khi:ấ gồm ký tự a (97) và dấu ^ / (225), dùng hàm PROPER thì thành Ấ gồm ký tự A (97-32=65) và dấu ^ / (225)
 
Theo tôi thì ngay cả VNI cũng không đúng.
Bởi vì dấu ^/ của chữ ấ (thường) thì có vị trí thấp hơn dấu ^/ của chữ Ấ (hoa) cho nên PROPER sẽ cho chữ Ấ rất kỳ: chữ A (hoa) nhưng dấu ^/ thì nằm thấp, dính vào chữ A.
Dùng hàm PROPER cho VNI bị lỗi như trên khi nguyên âm có dấu mũ, dấu thanh nằm ở đầu từ (án, ếch, ...).
Do hàm PROPER chuyển các ký tự đầu từ thành chữ hoa, các ký tự cón lại thành chữ thường.
Còn font VNI là 2 byte, á có 2 ký tự là a và dấu sắc. PROPER chì chuyển ký tự đầu là a thành A, còn dấu sắc không chuyển nên nhìn nó hơi kỳ kỳ.
 
Web KT
Back
Top Bottom