Soi lại UTF-8, mình đã dành riêng 1 bài dành cho UTF-8 (
xem chi tiết),
trong đó các bạn đã biết được quy luật chuyển đổi giữa UTF-8 và
Unicode. Các bạn hãy chú ý lại một điều, những ký tự thuộc 256 ký tự
ANSII sẽ không hề thay đổi khi chuyển chúng giữa ANSII và UTF-8. Hãy
ghi nhớ điều này
Tiếp đến, các bạn nên xem lại phần 1 của bài này (
xem chi tiết),
chúng ta có thể dùng Notepad++ để mã hóa dạng ANSII của văn bản sang mã
UTF-8. Như đã nói ở trên, chỉ những ký tự không thuộc ANSII (2 byte trở
lên) mới thay đổi khi ta thực hiện mã hóa, còn những ký tự 1 byte sẽ
không hề thay đổi khi ta thực hiện thao tác này
Vậy có nghĩa là 2 ký tự "lạ" trước mỗi câu sẽ giữ nguyên giá trị và
kích thước của nó. Đến đây bạn đã nhận ra được gì chưa nhỉ. Nếu chưa
thì hãy xem lại bài nâng cao đầu tiên của mình (
xem chi tiết), bạn sẽ được biết chính 2 ký tự này sẽ quy định độ dài của câu.
Như vậy công việc của chúng ta bây giờ là sửa các câu và hai ký tự quan
trọng đứng trước mỗi câu. Giá trị của hai ký tự này tùy thuộc độ dài
(số ký tự) của câu đứng ngay sau nó. Nhưng chú ý độ dài của các câu này
không phải tính theo số ký tự ở dạng Unicode mà bạn được thấy mà phải ở
dạng UTF-8 nguyên thủy.
Bây giờ chúng ta cùng tìm cách để làm sao cho nhanh nhé. Tất nhiên muốn
nhanh thì không thể bằng cách tự ngồi đếm số ký tự được mà chúng ta
phải nhờ đến máy tính. Muốn vậy chúng ta cần có kiến thức về lập trình
- đây chính là nội dung chính của bài viết, cũng là nguyên nhân của cái
tiêu đề dài dòng bên trên
Mình đã share một code chuyển đổi mẫu trên diễn đàn rồi (
tham khảo tại đây)
UTF-8 chuyển thành ký tự Unicode thì Notepad++ làm rồi, ta có thể tạm
bỏ qua và chỉ quan tâm đến Unicode -> UTF-8 thôi. Bạn xem đoạn code
sau
Code:
Public Function Unicode2UTF8(chuoiUnicode
As String)
As String'Author: Lord Kaj
'Language: Visual Basic 6
'Object: Module Function
'Level: Advance
'Input: Unicode string
'Output: UTF8 string
'Copyright: wWw.OpenItvn.Net Dim phan1
As Variant, phan2
As Variant, phan3
As Variant Dim vitriB
As Integer Dim kytuUnicode
As String vitriB = 1
Unicode2UTF8 = ""
Do While vitriB <= Len(chuoiUnicode)
kytuUnicode = AscW(Mid(chuoiUnicode, vitriB, 1))
If kytuUnicode < 128
Then Unicode2UTF8 = Unicode2UTF8 & Mid(chuoiUnicode, vitriB, 1)
Else phan3 = (kytuUnicode
Mod 64) + 128
phan1 = ((kytuUnicode - 128) \ 64) + 194
If phan1 > 223
Then phan2 = ((phan1 - 128) \ 64) + 223
phan1 = (phan1
Mod 64) + 128
Unicode2UTF8 = Unicode2UTF8 & Chr(phan2) & Chr(phan1) & Chr(phan3)
Else Unicode2UTF8 = Unicode2UTF8 & Chr(phan1) & Chr(phan3)
End If End If vitriB = vitriB + 1
LoopEnd Function Công dụng của hàm trên là đưa một chuỗi Unicode trở lại thành UTF-8
Đây là cách sử dụng nó. Bạn đưa vào tham số chuỗi Unicode khi gọi hàm này từ chương trình chính
Code:
Dim chuoiUFT8 As String
ChuoiUTF8 = Unicode2UTF8("Nội dung chuỗi Unicode")
Kết quả trả về sẽ là "
Ná»™i dung chuá»—i Unicode"
Như đã nói, vấn đề chỉ còn lại là 2 ký tự đặc biệt đầu tiên sẽ ra sao
thôi. Vì vậy ta dùng hàm trên để lấy độ dài của chuỗi Unicode sau khi
đã được đưa về UTF-8. Và hàm
Len kết hợp hàm trên sẽ đem lại điều mà ta muốn
Code:
Len(Unicode2UTF8("Nội dung chuỗi Unicode"))
Kết quả trả về sẽ là độ dài của "
Ná»™i dung chuá»—i Unicode", tức là bằng
26.
Đổi chuỗi này ra hex và nhớ thêm [00] phía trước nếu như kết quả chỉ có
1 byte (luôn nhớ rằng chúng ta có đến 2 ký tự đặc biệt phía trước),
Việc này cũng có thể nhờ máy tính làm luôn cho nhanh
Code:
Dim dodaicau
As IntegerDim ketqua
As Variantdodaicau = Len(Unicode2UTF8("Nội dung chuỗi Unicode"))
ketqua = Hex(dodaicau)
If dodaicau < 256
Then ketqua = Chr(0) & Chr(CLng("&H" & ketqua))
Else ketqua = Chr(CLng("&H" & Left(ketqua, Len(ketqua) - 2))) & Chr(CLng("&H" & Right(ketqua, 2)))
End If'In kết quả ra textbox rồi copy paste y nguyên vào notepad++ thay thế cho câu và cả 2 ký tự đặc biệt phía trước câu thôitxtKetqua.Text = ketquacuoicung
OK, các bạn copy paste mấy đoạn mã trên vào cho Visual Basic 6
rồi biên dịch ra sài thôi. Đến đây công việc của bạn chỉ còn dịch trong
chương trình tự tạo => copy kết quả => Paste vào những chỗ cần
thiết trong Notepad++
Vậy thôi....
Chưa có điều kiện làm 1 project lên các bạn làm hộ
nhé (mình đã nói rồi, phải có kiến thức lập trình). Nếu không làm được
thì chịu khó chờ, mình xin khất thêm vài ngày, khi có thời gian rảnh
mình sẽ làm ngay cho các bạn 1 cái :D
Chúc các bạn thành công!