Trang 1 trên 1

Những kiến thức nho nhỏ về file text

Đã gửi: T.Bảy 26/11/2011 1:20 pm
gửi bởi truongphu
Tên bài viết: Những kiến thức nho nhỏ về file text
Tác giả: truongphu
Cấp độ bài viết: Căn bản
Tóm tắt: Những kiến thức nho nhỏ về file text



1- Với các lệnh Open file của VB6, ta tạo được file text theo chuẩn ANSI, nghĩa là file sẽ được tất cả các soft về text đọc theo byte đến mức 255.
Mức 255 có các ký tự HOA tiếng Việt có dấu sau: À Á Â Ã È É Ê Ì Í Ð Ò Ó Ô Õ Ù Ú Ý kèm các ký tự thường; (trừ ký tự ð, thường của Ð &HD0 nêu bên trên; chính thức dùng Đ là &H110).
Đây là chuẩn tiện dụng và ngắn nhất, mỗi ký tự được ghi bởi 1 byte, được đọc hay ghi bất kể chuỗi dài ngắn, đầu đuôi...

2- Khi dùng "Scripting.FileSystemObject" để tạo file text, nếu đối số unicode là True (mặc định False) thì một file text unicode được tạo ra có đặc điểm là 2 byte đầu tiên được ghi là 255 và 254.
Nếu đối số là False, sẽ tạo ra file ANSI.
Trở lại với 2 byte đầu file được ghi, người ta gọi chúng là Bom (byte order mark), 2 file nầy dùng đánh dấu file được ghi theo định dạng unicode, nghĩa là bất kỳ ký tự nào cũng được ghi bởi 2 byte, kể cả các ký tự trong bảng ASCII mức 127. byte đầu là AscW Mod 256, byte sau là AscW \ 256; Với ký tự ANSI, byte sau luôn là 0.

Với VB6 chuẩn, muốn tạo file unicode, các bạn nhớ ghi 2 byte nầy.
Control TextBox chuẩn hổ trợ đọc chuỗi ANSI. các byte ngoài ANSI sẽ hiện lên dấu hỏi ?
Control TextBox MS forms 2.0 hổ trợ đọc chuỗi unicode (255 254), ngoài ra KHÔNG hổ trợ các chuẩn khác. (nhưng vẫn đọc chúng theo kiểu unicode, hậu quả thể hiện là một loạt ký tự tượng hình).

3- UTF-8 lại khác: Chỉ đọc text theo chuẩn ASCII, nghĩa là mức 127. Nhấn mạnh: mức ANSI 128-255 chúng đọc không ra!
Để đọc hiểu được ký tự unicode, chúng vừa đọc vừa dịch: byte nào có dãy bit là 1110 ở đầu thì chúng đọc 3 byte liên tiếp, dịch ra mã unicode, byte có 110 ở đầu thì chúng 2 byte liên tiếp và dịch, các byte khác thì giữ nguyên.
Bom là chuỗi 3 byte: 239 187 191

4- Ghi Bom có tác dụng cho các soft chuyên về text biết trước định dạng text của file. Với VB6, khi đọc file, ta bỏ qua các byte này. File ANSI không Bom.

5- UTF-8 cũng là unicode ghi theo mã hóa UTF-8, (Unicode UT-8). Nếu ghi theo chuẩn UTF-16 little-endian thì cả thế giới quen gọi chúng là "Unicode", (Unicode little endian). Chuẩn UTF-16 big-endian cũng tương tự unicode: Bom 254 255, có nghĩa là cách ghi cũng 2 byte như unicode nhưng vị trí đảo ngược. Ngoài ra Unicode còn được ghi theo nhiều chuẩn khác nữa...

6- VB6 không hổ trợ unicode, nhưng lại mặc định mỗi ký tự là 2 byte! Điều nầy khá mâu thuẫn và buồn cười. Bạn có thể test với code sau với ký tự A thuộc bảng ASCII có mã code là 65:

Mã: Chọn hết

Private Sub Form_Load()
Dim Test() As Byte
Test = Chr(65)
MsgBox UBound(Test)
MsgBox Test(LBound(Test)) & " và " & Test(UBound(Test))
End Sub


7- Tuy nhiên vẫn còn điều "an ủi" là một số control chuẩn VB6 có hổ trợ chuẩn "Vietnamese Locale CP 1258", để làm được điều nầy, bạn set font của control nhóm unicode, kèm theo mã Script là Vietnamese (Ô phía dưới bảng Font). Test như sau:

Mã: Chọn hết

Private Sub Form_Load()
Label1.Caption = "ThêÒ hiêòn caìc kyì týò tiêìng Viêòt chýa ðeòp lãìm"
End Sub

Nội dung của Label1 là "Thể hiện các ký tự tiếng Việt chưa đẹp lắm" (nhờ Unikey chuyển mã), mà đúng thế, các dấu thanh ghép vào nguyên âm có vẻ "chắp vá" không đẹp bằng các font unicode dựng sẵn.

8- File text thông thường chừng vài KB đến vài chục KB. Với dung lượng như thế, VB6 (For Input, Output) giải quyết nhanh gọn.
Khi làm việc với file text lớn vài MB đến vài chục MB, VB6 bắt đầu "ì-ạch". Mà đau đầu nhất là không một control Text nào hổ trợ số byte cấp Mega, dẫn đến "treo ứng dụng" do lỗi không đáp ứng.

[Ngang đây phải bàn ra ngoài lề một chút: Chả hiểu các soft đọc ebook được thiết kế thế nào mà file 5-10MB chúng đọc cái veo là xong! Tôi quen vài soft là Mobipocket Reader (prc), FBReader (nhiều đuôi), Microsoft Reader (lit) thấy chúng tải một file truyện kiếm hiệp nén dưới 10MB thật nhanh: nghĩa là vừa giải nén, vừa tải lên document! Tuy thế nhưng Maihoa Reader là số một: Tốc độ tải nhanh, riêng hổ trợ file text hàng trăm MB, (giới thiệu 2GB!).
Tôi đã dùng công cụ tìm class của chúng, mong xem được làm bằng gì, thế nhưng chả thu lượm được kết quả; nghe đâu dùng DHTML, tôi cũng vẽ lên DHTMLEdit1, lệnh cho DHTMLEdit1.DocumentHTML =text 5MB nhưng vẫn bị treo!]

Trở lại VB6 load file text nặng ký:
* Ta không nên đọc file theo dạng chuỗi mà nên đọc theo dạng mảng byte (For binary), cách sau nhanh hơn cách trước vài chục lần tùy dung lượng file.
* Ta không nên tải toàn nội dung file (LOF(Num)): vì biến chứa sẽ ì ạch, mà nên tạo một loạt nhiều mảng byte lần lượt tải nội dung file cho đến hết; cách sau nhanh hơn cách trước vài chục lần tùy dung lượng file.
Kết quả thử nghiệm trên máy của tôi: File text 7MB: mảng byte với LOF(Num) là 26 giây, mà loạt (700) mảng byte load toàn bộ nội dung thì chỉ 2 giây, thật ấn tượng.
* Các function nên hoạt động trên các mảng nhỏ hơn là làm trên mảng LOF. Function Mảng-Mảng nhanh hơn Function Chuỗi-Chuỗi nhiều lần.
* TextBox 2.0 load được bao nhiêu byte là nhanh? chưa biết, nhưng tôi chọn là 10000 thấy hiệu quả. Với loạt mảng đã có, ta tuần tự đọc hết file text nặng ký.