• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Công bố chuẩn mã hóa Unicode (16bit) mới Unicode-TP

Bạn muốn open source dự án mình đang phát triển để mọi người cùng theo dõi tiến độ, góp ý kiến, hổ trợ và tiếp sức thêm? Hãy đăng ký dự án mã nguồn mở của mình tại đây

Điều hành viên: Điều hành

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Công bố chuẩn mã hóa Unicode (16bit) mới Unicode-TP

Gửi bàigửi bởi truongphu » T.Hai 21/11/2011 9:43 pm

Dự án mã nguồn mở: Công bố chuẩn mã hóa Unicode mới Unicode-TP, viết tắt: Uni-tp
(16bit Unicode-TP, Encode and Decode)

Định dạng chuỗi theo Unicode, mỗi ký tự buộc phải gồm 2 byte; đấy là sự tiến bộ lớn so với định dạng UTF-8 (unicode) lúc thì 3 byte, lúc thì 2 byte rối rắm, và thông thường độ dài chuỗi byte thường hơn unicode độ 1/3. (Thế nhung không hiểu sao môi trường Net lại thích thú với utf-8)
Nếu làm việc với file text có dung lượng nhỏ, ghi theo mã unicode là tối ưu.
Tuy nhiên khi ta làm việc với những file text có dung lượng thật lớn, vd 100MB trở lên, lúc đấy máy tính chạy ì ạch vô cùng, mong muốn làm sao cho dung lượng nhỏ bớt đi thì tốt.
Với tiếng Việt, đa số nguyên âm đều nằm giữa các ký tự phụ âm, điều nầy có nghĩa là số ký tự ANSI trong chuỗi tiếng Việt vẫn chiếm phần lớn chuỗi. Nảy sinh ra mong muốn chỉ mã hóa ký tự nào ngoài bảng ANSI, như thế dung lượng file text hay độ dài chuỗi byte sẽ nhỏ hay ngắn lại.
Và như thế, Chuẩn mã hóa Unicode mới ra đời: Unicode-TP, viết tắt: Uni-tp, chỉ mã hóa các ký tự có mã code lớn hơn 255.
Ưu điểm nổi trội: file trước ghi theo mã unicode giờ theo chuẩn ghi mới sẽ giảm non phân nữa.
Bạn cứ tưởng tượng, thay vì làm việc với file 100MB, giờ thao tác trên hơn 50MB có lẽ sung sướng vô cùng.
Vì là dự án mã nguồn mở, Rất mong các bạn cùng thảo luận.

* Encode
  1. Function UniToUtp(Ar() As Byte) As Byte()
  2.     Dim Temp() As Byte, i&, j&
  3.     For i = 0 To UBound(Ar) ' author truongphu
  4.        If Ar(i) > 0 Then
  5.             ReDim Preserve Temp(j)
  6.             Temp(j) = Ar(i)
  7.             j = j + 1
  8.         End If
  9.     Next
  10.     UniToUtp = Temp
  11. End Function


* Decode
  1. Function UtpToUni(Ar() As Byte) As Byte()
  2.     Dim Temp() As Byte, i&, j& ' author truongphu
  3.    On Error Resume Next  'vì ký tu cuô'i = ubound rô`i +1 se overflow
  4.    For i = 0 To UBound(Ar)
  5.         If (Ar(i) > 42) And (Ar(i) < 127) Or (Ar(i) > 31) And (Ar(i) < 40) Then
  6.             If (Ar(i) = 40 And (Ar(i + 1) = 1)) Or (Ar(i) = 41 And (Ar(i + 1) = 1)) Or (Ar(i) = 104 And (Ar(i + 1) = 1)) Or (Ar(i) = 105 And (Ar(i + 1) = 1)) Then GoTo DieuChinh
  7.             ReDim Preserve Temp(j)
  8.             Temp(j) = Ar(i)
  9.             j = j + 1
  10.             ReDim Preserve Temp(j)
  11.             Temp(j) = 0
  12.         ElseIf ((Ar(i) > 191) And (Ar(i + 1) <> 30)) And ((Ar(i) < 254) And (Ar(i + 1) <> 30)) Or (Ar(i) = 10) Or (Ar(i) = 13) Then
  13.             ReDim Preserve Temp(j)
  14.             Temp(j) = Ar(i)
  15.             j = j + 1
  16.             ReDim Preserve Temp(j)
  17.             Temp(j) = 0
  18.         Else
  19. DieuChinh:
  20.             ReDim Preserve Temp(j)
  21.             Temp(j) = Ar(i)
  22.         End If
  23.         j = j + 1
  24.     Next
  25.     UtpToUni = Temp
  26. End Function


* Bài Tây tiến của Quang Dũng được ghi theo Uni-tp:
Tây ti¿n
Quang Ding
Phù L°u Chanh -- 1948

Sông Mã xa rÓi Tây ti¿n ¡i!
NhÛ vÁ rëng núi nhÛ ch¡i v¡i
Sài Khao s°¡ng l¥p oàn quân mÏi
M°Ýng Lát hoa vÁ trong êm h¡i

DÑc lên khúc khu÷u dÑc thm th³m
Heo hút cÓn mây súng ngíi trÝi
Ngàn th°Ûc lên cao ngàn th°Ûc xuÑng
Nhà ai Pha Luông m°a xa kh¡i

Anh b¡n dãi d§u không b°Ûc nïa
Gåc lên súng mi bÏ quên Ýi!
ChiÁu chiÁu oai linh thác g§m thét
êm êm M°Ýng HËch cÍp trêu ng°Ýi

NhÛ ôi Tây ti¿n c¡m lên khói
Mai Châu mùa em th¡m n¿p xôi
Doanh tr¡i bëng lên hÙi uÑc hoa
Kìa em xiêm áo tñ bao giÝ
Khèn lên man iÇu nàng e ¥p
Nh¡c vÁ Viên Chn xây hÓn th¡

Ng°Ýi i Châu MÙc chiÁu s°¡ng ¥y
Có th¥y hÓn lau n»o b¿n bÝ
Có nhÛ dáng ng°Ýi trên Ùc mÙc
Trôi dòng n°Ûc li hoa ong °a

Tây ti¿n oàn quân không mÍc tóc
Quân xanh màu lá dï oai hùm
M¯t trëng gíi mÙng qua biên giÛi
êm m¡ Hà NÙi dáng kiÁu th¡m

R£i rác biên c°¡ng mÓ viÅn xé
Chi¿n tr°Ýng i ch³ng ti¿c Ýi xanh
Áo bào thay chi¿u anh vÁ ¥t
Sông Mã g§m lên khúc Ùc hành

Tây ti¿n ng°Ýi i không h¹n °Ûc
°Ýng lên thm th³m mÙt chia phôi
Ai lên Tây ti¿n mùa xuân ¥y
HÓn vÁ S§m Néa ch³ng vÁ xuôi.


FileLen = 1.300 bytes
(Nếu unicode, 2282 byte)
Tập tin đính kèm
Uni-Tp.rar
(3.58 KiB) Đã tải 363 lần
Sửa lần cuối bởi truongphu vào ngày T.Ba 22/11/2011 7:56 pm với 1 lần sửa.


o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: Công bố chuẩn mã hóa Unicode mới Unicode-TP

Gửi bàigửi bởi truongphu » T.Ba 22/11/2011 10:09 am

Như đã trình bày ở bài công bố, nếu dùng file text có dung lượng nhỏ, nên dùng mã hóa theo unicode trước giờ.

Với những bạn làm việc trên file text có dung lượng thật lớn, từ vài MB trở lên, việc mã hóa theo định dạng UTP là tối ưu nhất.
Dung lượng file sẽ giảm rõ rệt so với trước.
Các bạn có thể dùng tự do các mã nguồn encode và decode để ghi file text và đọc file text.
Truy xuất các file text, tốc độ nhanh nhất là mở file theo binary và đọc một đoạn text chỉ định. Tôi đã test trên file 2GB (2048MB), với kết quả đọc đoạn text chỉ 10 giây.
(file text trên 10MB, nếu bạn mở với notepad cũng có thể bị treo!).

Hai function ở bài viết trên còn "luộm thuộm", do tính lịch sử nên tôi để yên, không sửa, và sau đây là 2 function thay thế:
1- Giảm bớt lệnh Redim Preserve vì làm chậm máy.
2- Cấu trúc If Else khá dài dòng, chuyển qua cấu trúc Select.
3- Loại bỏ lệnh On Error để hoàn toàn kiểm soát chương trình.

Encode:

  1. Function UniToUtp(Ar() As Byte) As Byte()
  2. If UBound(Ar) = -1 Then Exit Function
  3.     Dim Temp() As Byte, i&, j&
  4.     ReDim Temp(UBound(Ar))
  5.     For i = 0 To UBound(Ar) ' author truongphu
  6.        If Ar(i) > 0 Then
  7.             Temp(j) = Ar(i)
  8.             j = j + 1
  9.         End If
  10.     Next
  11.     j = 0
  12.     For i = UBound(Temp) To UBound(Temp) / 2 Step -1
  13.         If Temp(i) = 0 And Temp(i - 1) = 0 Then
  14.             j = j + 1
  15.         Else
  16.             Exit For
  17.         End If
  18.     Next
  19.     ReDim Preserve Temp(UBound(Temp) - j - 1)
  20.     UniToUtp = Temp
  21. End Function


Decode

  1. Function UtpToUni(Ar() As Byte) As Byte()
  2. If UBound(Ar) = -1 Then Exit Function
  3.     Dim Temp() As Byte, i&, j& ' author truongphu
  4.    ReDim Temp(UBound(Ar) * 2)
  5.     For i = 0 To UBound(Ar)
  6.     If i < UBound(Ar) Then
  7.         Select Case Ar(i + 1)
  8.             Case 1, 30
  9.                 Temp(j) = Ar(i)
  10.                 j = j + 1
  11.                 Temp(j) = Ar(i + 1)
  12.                 i = i + 1
  13.             Case Else
  14.                 Temp(j) = Ar(i)
  15.                 j = j + 1
  16.                 Temp(j) = 0
  17.         End Select
  18.         j = j + 1
  19.     Else
  20.         Temp(j) = Ar(i)
  21.     End If
  22.     Next
  23.     j = 0
  24.     For i = UBound(Temp) To UBound(Temp) / 2 Step -1
  25.         If Temp(i) = 0 And Temp(i - 1) = 0 Then
  26.             j = j + 1
  27.         Else
  28.             Exit For
  29.         End If
  30.     Next
  31.     ReDim Preserve Temp(UBound(Temp) - j)
  32.     UtpToUni = Temp
  33. End Function
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Thuật toán mã hóa UTP

Gửi bàigửi bởi truongphu » T.Ba 22/11/2011 10:11 am

A- Thuật toán mã hóa UTP
1- Nếu mã code của ký tự thuộc bảng ANSI (<256), giữ nguyên mã code
2- Nếu mã code của ký tự ngoài bảng ANSI (>256), sử dụng 2 byte để ghi mã code:
* byte đầu tiên là phần dư của mã code / 256 = (mã code) Mod 256
* byte sau là phần nguyên của mã code/ 256 = (Mã code) \ 256

B- Encode UTP với VB6 như sau:

  1. Function Uni2Utp(ByVal Chuôi As String) As String
  2.     If Chuôi = "" Then Exit Function
  3.     Dim Te As String, Tem() As Byte, i&
  4.     For i = 1 To Len(Chuôi) ' author truongphu
  5.        If AscW(Mid(Chuôi, i, 1)) < 256 Then
  6.             Te = Te & Mid(Chuôi, i, 1)
  7.         Else
  8.             Tem() = Mid(Chuôi, i, 1)
  9.             Te = Te & Chr(Tem(0)) & Chr(Tem(1))
  10.         End If
  11.     Next
  12.     Uni2Utp = Te
  13. End Function


C- File UTP:
Vì chuẩn mới nên Thế giới chưa họp bàn (!) về BOM (byte order mark) quy định cho file text.
Do không có BOM, các soft đọc text sẽ xem file utp như là một file anci.
Đương nhiên còn nhiều điều chưa họp bàn như codepage CP_UTP, hàm API hổ trợ...

D- Decode UTP với VB6 như sau:

  1. Function Utp2Uni(ByVal Chuôi As String) As String
  2.     If Chuôi = "" Then Exit Function
  3.     Dim Te As String, Tem As Long, i&
  4.     For i = 1 To Len(Chuôi) ' author truongphu
  5.    If i < Len(Chuôi) Then
  6.         If (Asc(Mid(Chuôi, i + 1, 1)) = 1) Or (Asc(Mid(Chuôi, i + 1, 1)) = 30) Then
  7.             Tem = Asc(Mid(Chuôi, i, 1)) + Asc(Mid(Chuôi, i + 1, 1)) * 256
  8.             Te = Te & ChrW(Tem)
  9.             i = i + 1
  10.         Else
  11.             Te = Te & Mid(Chuôi, i, 1)
  12.         End If
  13.     Else
  14.         Te = Te & Mid(Chuôi, i, 1)
  15.     End If
  16.     Next
  17.     Utp2Uni = Te
  18. End Function
Sửa lần cuối bởi truongphu vào ngày T.Ba 29/11/2011 9:21 am với 1 lần sửa.
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: Công bố chuẩn mã hóa Unicode mới Unicode-TP

Gửi bàigửi bởi truongphu » T.Ba 22/11/2011 3:54 pm

Bài viết của thành viên truongphu đã nhận được lời cảm ơn từ:
NoBi (Hôm nay 10:29 am)

Admin đã ủng hộ bài viết Dự án bằng lời cảm ơn

====
Để thuận lợi cho việc đọc file utf, tôi viết thêm hàm (decode) chuyển từ mảng sang chuỗi:
  1. Public Function Utp2UniS(Ar() As Byte) As String ' Mang-Chuôi
  2. If UBound(Ar) = -1 Then Exit Function
  3.     Dim Temp As String, i& ' author truongphu
  4.    For i = 0 To UBound(Ar)
  5.     If i < UBound(Ar) Then
  6.         Select Case Ar(i + 1)
  7.             Case 1, 30
  8.                 Temp = Temp & ChrW(Ar(i) + Ar(i + 1) * 256)
  9.                 i = i + 1
  10.             Case Else
  11.                 Temp = Temp & Chr(Ar(i))
  12.         End Select
  13.     Else
  14.         Temp = Temp & Chr(Ar(i))
  15.     End If
  16.     Next
  17.     Utp2UniS = Temp
  18. End Function


Sau đây là Project có toàn bộ các hàm encode và decode để các bạn có thể thuận tiện đọc và ghi unicode theo chuẩn utp. Project có kèm app
Tập tin đính kèm
Su Dung Mã UTP Ðoc và Viêt File TXT.rar
(15.54 KiB) Đã tải 340 lần
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
ledoninh
VIP
VIP
Bài viết: 38
Ngày tham gia: T.Sáu 26/08/2005 3:52 pm
Đến từ: HCMC
Has thanked: 1 time
Liên hệ:

Re: Công bố chuẩn mã hóa Unicode mới Unicode-TP

Gửi bàigửi bởi ledoninh » T.Ba 22/11/2011 4:35 pm

Xin góp ý với bác một chút.

Hiện nay, Unicode sử dụng 4 byte chứ không phải 2 byte, một lần có thành viên đã thắc mắc về mấy chữ Tàu có code lớn hơn 65535, VB không thể nào đọc nổi. UTF-8 chính là cầu nối giữa chuẩn ASCII và Unicode, khiến những chương trình cũ mèm như VB có thể nhận ra được các ký tự Unicode 32 bit được mã hoá dạng UTF-8 (từ 1 đến 6 bytes). Cái "độc" của UTF-8 là ở chỗ chuỗi bytes của ký tự có mã lớn không chứa chuỗi bytes của ký tự có mã nhỏ hơn, do đó việc tìm kiếm là chuẩn.
Trở lại đề tài của bác, thứ nhất là chỉ áp dụng cho 65536 ký tự đầu tiên của Unicode (rất may, bảng chữ cái tiếng Việt nằm ở đây cả); và, thứ hai là, bác phải chứng tỏ việc tìm kiếm trên tài liệu mã hoá UTP là chuẩn - không lộn sang ký tự khác.

Xin cổ vũ bác, nhiệt tình chế cho dân ta xài và đồng thời thể dục bộ não cho trẻ dai! :D
Không mua hàng tiêu dùng của Trung Quốc, Đài Loan

Hình đại diện của người dùng
tdat00
Thành viên tích cực
Thành viên tích cực
Bài viết: 137
Ngày tham gia: T.Bảy 29/03/2008 8:18 am
Has thanked: 8 time
Been thanked: 2 time

Re: Công bố chuẩn mã hóa Unicode mới Unicode-TP

Gửi bàigửi bởi tdat00 » T.Ba 22/11/2011 4:53 pm

đầu tiên là cảm ơn bác Phú và những ai đang tham gia dự án này về một đề tài thú vị.

Tuy nhiên em có thắc mắc là mục đích của bảng mã này để làm gì? Nếu để thể hiện nội dung text thì các chương trình thông dụng không hỗ trợ. Còn nếu đơn thuần chỉ để giảm bớt kích thước lưu trữ thì có thể dùng chuẩn Gzip để nén lại, sẽ nhỏ hơn rất nhiều.

PS: notepad load các file > 1MB chậm là do nó xài thuật toán cổ lỗ sĩ chứ không phải do Unicode.

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: Công bố chuẩn mã hóa Unicode (16bit) mới Unicode-TP

Gửi bàigửi bởi truongphu » T.Ba 22/11/2011 8:26 pm

Chào Thầy Ninh.
ledoninh đã viết:Hiện nay, Unicode sử dụng 4 byte chứ không phải 2 byte

Tôi đọc sách báo có biết, nhưng hàm ChrW trên VB6 chỉ hổ trợ số Long đến 65535
ledoninh đã viết:và, thứ hai là, bác phải chứng tỏ việc tìm kiếm trên tài liệu mã hoá UTP là chuẩn - không lộn sang ký tự khác.

Điều nầy tôi không nghĩ đến!
Thực ra mã hóa UTP thực chất chỉ là loại bỏ các mã số 0 của các ký tự ansi viết theo unicode = 2 byte; các mã code khác vẫn y nguyên: ansi và unicode 2 byte không thay đổi.
Nhóm unicode của tiếng Việt có byte sau mang số 1 và số 30 (phần lớn); mà 2 số nầy không dùng trong text nên cũng khó lẫn lộn khi một chuỗi byte xuất hiện.
vd unicode "Uộ" được ghi 217 0 217 30
ta chỉ bỏ byte 0 thành 217 217 30
byte 217 đầu không tổ hợp với số khác có ý nghĩa trong tiếng Việt.

Cảm ơn Thầy Ninh cổ vũ, hy vọng thầy góp ý nhiều thêm...
----------
tdat00 đã viết:mục đích của bảng mã này để làm gì?

"Nó" cũng ngang hàng với các cách mã hóa unicode khác như unicode, utf-8, VN CP 1258...
tdat00 đã viết:Nếu để thể hiện nội dung text thì các chương trình thông dụng không hỗ trợ.

Rõ ràng! "Nó" mới sinh được có 1 ngày mà. Và nhiệm vụ chúng ta, dân lập trình để "mần" chi?
Nhóm function encode và decode ở trên là "nguyên liệu" để tạo ra các tools...
tdat00 đã viết:đơn thuần chỉ để giảm bớt kích thước lưu trữ thì có thể dùng chuẩn Gzip để nén lại, sẽ nhỏ hơn rất nhiều.

Vấn đề dung lượng ở đây không phải là lưu trữ, mà là dung lượng thực hành. bạn mở file text 10MB và file text 6MB, bên nào "nhẹ" hơn? làm việc nhanh hơn?

Chúc vui.
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: Công bố chuẩn mã hóa Unicode (16bit) mới Unicode-TP

Gửi bàigửi bởi truongphu » T.Ba 06/12/2011 8:24 pm

Để hổ trợ cho việc đọc file text encoding UTP, tôi viết soft nầy, sẽ hỗ trợ nhiều định dạng: unicode, utf-8, utp, ansi.
Soft có khả năng đọc tức thời bất kể dung lượng GB. Đây là điểm nổi bật. Dialog và đọc file đều dùng trực tiếp hàm API nên khá nhanh.
Soft tuy viết trên VB6 nhưng đọc path unicode êm.
Soft không chiếm dụng nhiều bộ nhớ: chỉ 10MB khi hoạt động.
Thể hiện tiếng Việt với utextbox độc lập. (không dùng MS Forms 2.0). utextbox hổ trợ tải nhiều ký tự nhanh hơn textbox 2.0
Trong khi chuẩn UTP chưa phổ biến, nếu bạn có tài liệu khá nhạy cảm, nên chuyển qua định dạng nầy: bảo mật và giảm dung lượng file.
Tập tin đính kèm
Ðoc file text nhiêu Ðinh dang.rar
(23.03 KiB) Đã tải 342 lần
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

-_=TiepThieuGia=_-
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 75
Ngày tham gia: T.Năm 24/04/2008 11:43 am

Re: Công bố chuẩn mã hóa Unicode (16bit) mới Unicode-TP

Gửi bàigửi bởi -_=TiepThieuGia=_- » T.Tư 07/12/2011 12:18 am

Cháu thấy dự án này rất hay và rất ủng hộ, cháu có 1 vài câu hỏi thêm như sau:

- 1 file lưu theo chuẩn UTP này và chuẩn TCVN 3, file nào có dung lượng nhỏ hơn.
- Thời gian convert từ chuẩn UTF-8 sang UTP và sang TCVN 3, cái nào nhanh hơn.

Cháu rất mong dự án tiếp tục phát triển.

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: Công bố chuẩn mã hóa Unicode (16bit) mới Unicode-TP

Gửi bàigửi bởi truongphu » T.Tư 07/12/2011 10:37 am

-_=TiepThieuGia=_- đã viết:Cháu thấy dự án này rất hay và rất ủng hộ

Cảm ơn bạn -_=TiepThieuGia=_-
-_=TiepThieuGia=_- đã viết:- 1 file lưu theo chuẩn UTP này và chuẩn TCVN 3, file nào có dung lượng nhỏ hơn.

Đương nhiên TCVN3 phải nhỏ hơn vì đó là font 1 byte, mỗi ký tự chiếm 1 byte; trong khi UTP các ký tự ngoài bảng ANSI(1 byte) phải lưu thành 2 byte như unicode. Tuy nhiên dung lượng không lớn hơn là bao (vì các nguyên âm khá ít trong chuỗi). Bạn có thể so sánh dung lượng (tương đối) qua các file Tây Tiên (unicode, UTF-8, UTP, ANSI) đính kèm trong file [Ðoc file text nhiêu Ðinh dang.rar] ở bài viết trên.

(hai năm lại đây trên máy tính của tôi đã không còn cài các font ABC, VNI nữa vì không còn tính thực dụng)

-_=TiepThieuGia=_- đã viết:- Thời gian convert từ chuẩn UTF-8 sang UTP và sang TCVN 3, cái nào nhanh hơn.

Tôi chưa có tư liệu về các function chuyển trực tiếp UTF-8 sang UTP hoặc UTF-8 sang TCVN3.
Có lẽ tạm dùng Unicode trung gian: UTF-8 sang Unicode - UTP hay UTF-8 sang Unicode - TCVN3.

Nói về chuyển Unicode - TCVN3: có lẽ có nhiều Function làm việc nầy. Trước đây tôi cũng có viết, hiện vẫn còn trong Box thủ thuật. Xin nói ngay rằng lúc đó tôi viết theo kiểu Chuỗi-Chuỗi, tuy nhiên hiện tại tôi rất thích kiểu Mảng-Mảng vì nhanh hơn. Bạn xem các function qua lại giữa UTP và Unicode ở trên.

Nếu viết một function trực tiếp từ UTF-8 sang UTP, có lẽ khá nhanh vì cả 2 đều dùng bảng mã Unicode, cơ chế đọc byte khá tương đồng: byte ACII hai bên đều dùng 1 byte (các phụ âm), chỉ còn các nguyên âm thì UTF8 chiếm 2-3 byte chuyển qua UTP còn 1-2 byte.

Còn viết một function trực tiếp từ UTF-8 sang ABC, có lẽ bỏ lâu nên tôi chưa hình dung việc viết thế nào...

Bạn thử viết và so sánh xem sao...
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

Re: Công bố chuẩn mã hóa Unicode (16bit) mới Unicode-TP

Gửi bàigửi bởi truongphu » T.Tư 07/12/2011 3:46 pm

-_=TiepThieuGia=_- đã viết:convert từ chuẩn UTF-8 sang UTP


Tặng bạn function chuyển utf-8 sang utp:

  1. Public Function Utf82UTP(Ar() As Byte) As Byte() ' Mang-Mang
  2.    If UBound(Ar) = -1 Then Exit Function
  3.     On Error Resume Next
  4.     Dim Temp() As Byte, i&, j&, U&
  5.     ReDim Temp(UBound(Ar))
  6.  
  7.     For i = 0 To UBound(Ar) ' author truongphu
  8.    If i < UBound(Ar) Then
  9.         Select Case Ar(i)
  10.             Case 225:
  11.                 U = 7680 + (Ar(i + 1) - 186) * 64 + Ar(i + 2)
  12.                 Temp(j) = U Mod 256
  13.                 j = j + 1: i = i + 2
  14.                 Temp(j) = 30
  15.             Case 196 To 198:
  16.                 U = (Ar(i) - 194) * 64 + Ar(i + 1)
  17.                 Temp(j) = U Mod 256
  18.                 j = j + 1: i = i + 1
  19.                 Temp(j) = U \ 256
  20.             Case 195
  21.                 U = (Ar(i) - 194) * 64 + Ar(i + 1)
  22.                 Temp(j) = U Mod 256
  23.                 i = i + 1
  24.             Case Is < 128
  25.                 Temp(j) = Ar(i)
  26.                 U = 222 ' phai ghi Ðê ký tu thu 4 có U
  27.            Case Else: 'loai bo BOM
  28.                U = 333
  29.         End Select
  30.     Else ' ký tu cuôi cùng
  31.        Temp(j) = Ar(i)
  32.     End If
  33.         If U <> 333 Then j = j + 1
  34.     Next
  35.     ReDim Preserve Temp(j - 1)
  36.     Utf82UTP = Temp
  37. End Function
  38.  
Tập tin đính kèm
UTF8 To UTP.rar
(3.15 KiB) Đã tải 292 lần
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

Hình đại diện của người dùng
mushu
Thành viên danh dự
Thành viên danh dự
Bài viết: 51
Ngày tham gia: T.Hai 14/04/2008 10:00 am
Has thanked: 1 time
Been thanked: 1 time
Liên hệ:

Re: Công bố chuẩn mã hóa Unicode (16bit) mới Unicode-TP

Gửi bàigửi bởi mushu » T.Sáu 20/01/2012 2:21 pm

Tạm bỏ qua mã unicode được mã hóa 32 bit. (UTF-8 dùng 6 byte mã hóa được 31 byte thôi)
Cách mã hóa như bác truongphu em thấy không ổn lắm.
Thứ nhất là từ mã không có tính phân tách. Bộ mã như vậy là không đảm bảo khả năng giải mã rồi.
Cách mã hóa trên cũng không thể mã hóa được hết 2 byte của unicode. Thực chất sẽ phải bỏ đi một dải kí tự để tạo được tính phân tách cho từ mã.
Nhìn cách mã hóa thì có thể coi là bỏ đi phần có chứa 00.
Nhưng khi nhìn phần giải mã (cái bác kêu đã viết lại đó) thì em thấy nó bỏ đi mã sau: 0x0001, 0x001E, Và chỉ mã hóa các mã có hai byte dạng 0x01??, 0x1E?? thôi. Nó chứa đủ các kí tự tiếng việt nhưng lại thiếu một số kí tự đặc biệt dùng trong văn bản như dưới.
“Quotes”

Chắc hẳn ai đánh văn bản đều thấy nó tự động đổi hai dấu nháy thành đóng và mở. Một cái có mã unicode là 8220 (0x201C), 8221(0x201D). 0x20 không thể tách như cách trên vì thế nó sẽ là kí tự cách cũng không thể loại bỏ ra khỏi bảng mã được.

Mình thấy có thể xem xét thêm lại về việc encode để cho đảm bảo hơn với một số kí tự khác thường dùng trong nhập xuất văn bản là được.
Và nên xây dựng thêm cả hàm check để đảm bảo quá trình encode dữ liệu không bị mất thông tin.


Bộ mã bác truongphu không thể thay thế các chuẩn mã hóa UTF-8, UTF-16 (LE, BE), UTF-32.
Hơn nữa cách xây dựng bộ mã UTF hoàn toàn có thể encode và decode chỉ cần sử dụng bitwise.


Quay về “Dự án mã nguồn mở”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách