cảm ơn bạn đã gửi thông tin, do file tổng hợp từ các bộ phận gửi ( vài ngàn dòng ) nên cần giải pháp tìm font ở mỗi dòng để tổng hợp về 1 font duy nhất nên nhờ GPE chỉ giùm cách xác định font ở từng dòng. Cám ơn.Nhìn bằng mắt thì những chỗ "bình thường" có vẻ đang dùng mã unicode, còn những chỗ "đầu trâu mặt ngựa" có vẻ đang dùng mã VNI (chọn bảng mã VNI khi gõ bằng Unikey)
Bài này phải phối hợp nhiều code của các bác đã làm sẳn trên GPE này.cảm ơn bạn đã gửi thông tin, do file tổng hợp từ các bộ phận gửi ( vài ngàn dòng ) nên cần giải pháp tìm font ở mỗi dòng để tổng hợp về 1 font duy nhất nên nhờ GPE chỉ giùm cách xác định font ở từng dòng. Cám ơn.
Function detectVNICode(ByVal Text$) As Integer
On Error Resume Next
If Text = vbNullString Then
Exit Function
End If
Dim z, i%, j%, sp, A(), m&, n&, X%
z = VNICodes
For i = 2 To UBound(z)
n = 0
sp = Split(z(i), "/")
For j = LBound(sp) To UBound(sp)
n = n - (Text Like "*" & sp(j) & "*")
Next
If n > m Then
m = n: X = i
End If
Next
detectVNICode = X
End Function
Function VNICodes()
'https://en.wikipedia.org/wiki/Byte_order_mark
Const n_ = vbNullString
Dim A$, b$, c$, d$, E$, f, g, H, i%, z(18)
A = ChrW(&H300): b = ChrW(&H301): c = ChrW(&H303): d = ChrW(&H309): E = ChrW(&H323)
f = VBA.Array(225, 224, 7843, 227, 7841, 259, 7855, 7857, 7859, 7861, 7863, 226, 7845, 7847, 7849, 7851, 7853, 233, 232, 7867, 7869, 7865, 234, 7871, 7873, 7875, 7877, 7879, 237, 236, 7881, 297, 7883, 243, 242, 7887, 245, 7885, 244, 7889, 7891, 7893, 7895, 7897, 417, 7899, 7901, 7903, 7905, 7907, 250, 249, 7911, 361, 7909, 432, 7913, 7915, 7917, 7919, 7921, 253, 7923, 7927, 7929, 7925, 273, 193, 192, 7842, 195, 7840, 258, 7854, 7856, 7858, 7860, 7862, 194, 7844, 7846, 7848, 7850, 7852, 201, 200, 7866, 7868, 7864, 202, 7870, 7872, 7874, 7876, 7878, 205, 204, 7880, 296, 7882, 211, 210, 7886, 213, 7884, 212, 7888, 7890, 7892, 7894, 7896, 416, 7898, 7900, 7902, 7904, 7906, 218, 217, 7910, 360, 7908, 431, 7912, 7914, 7916, 7918, 7920, 221, 7922, 7926, 7928, 7924, 272)
g = VBA.Array(97, 97, 97, 97, 97, 259, 259, 259, 259, 259, 259, 226, 226, 226, 226, 226, 226, 101, 101, 101, 101, 101, 234, 234, 234, 234, 234, 234, 105, 105, 105, 105, 105, 111, 111, 111, 111, 111, 244, 244, 244, 244, 244, 244, 417, 417, 417, 417, 417, 417, 117, 117, 117, 117, 117, 432, 432, 432, 432, 432, 432, 121, 121, 121, 121, 121, 273, 65, 65, 65, 65, 65, 258, 258, 258, 258, 258, 258, 194, 194, 194, 194, 194, 194, 69, 69, 69, 69, 69, 202, 202, 202, 202, 202, 202, 73, 73, 73, 73, 73, 79, 79, 79, 79, 79, 212, 212, 212, 212, 212, 212, 416, 416, 416, 416, 416, 416, 85, 85, 85, 85, 85, 431, 431, 431, 431, 431, 431, 89, 89, 89, 89, 89, 272)
H = VBA.Array(b, A, d, c, E, n_, b, A, d, c, E, n_, b, A, d, c, E, b, A, d, c, E, n_, b, A, d, c, E, b, A, d, c, E, b, A, d, c, E, n_, b, A, d, c, E, n_, b, A, d, c, E, b, A, d, c, E, n_, b, A, d, c, E, b, A, d, c, E, n_, b, A, d, c, E, n_, b, A, d, c, E, n_, b, A, d, c, E, b, A, d, c, E, n_, b, A, d, c, E, b, A, d, c, E, b, A, d, c, E, n_, b, A, d, c, E, n_, b, A, d, c, E, b, A, d, c, E, n_, b, A, d, c, E, b, A, d, c, E, n_)
UnicodeHex: z(16) = f
DecimalNCRs: z(17) = f
HexNCRs: z(18) = f
For i = LBound(f) To UBound(f)
A = Hex(f(i))
A = String(4 - Len(A), "0") & A
z(16)(i) = "\u" & A
z(17)(i) = "&#" & f(i) & ";"
z(18)(i) = "&#x" & A & ";"
f(i) = ChrW(f(i))
g(i) = ChrW(g(i)) & H(i)
Next
NotMask1: z(0) = "a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/e/e/e/e/e/e/e/e/e/e/e/i/i/i/i/i/o/o/o/o/o/o/o/o/o/o/o/o/o/o/o/o/o/u/u/u/u/u/u/u/u/u/u/u/y/y/y/y/y/d/A/A/A/A/A/A/A/A/A/A/A/A/A/A/A/A/A/E/E/E/E/E/E/E/E/E/E/E/I/I/I/I/I/O/O/O/O/O/O/O/O/O/O/O/O/O/O/O/O/O/U/U/U/U/U/U/U/U/U/U/U/Y/Y/Y/Y/Y/D"
NotMask2: z(1) = "a/a/a/a/a/" & ChrW(259) & "/" & ChrW(259) & "/" & ChrW(259) & "/" & ChrW(259) & "/" & ChrW(259) & "/" & ChrW(259) & "/â/â/â/â/â/â/e/e/e/e/e/ê/ê/ê/ê/ê/ê/i/i/i/i/i/o/o/o/o/o/ô/ô/ô/ô/ô/ô/" & ChrW(417) & "/" & ChrW(417) & "/" & ChrW(417) & "/" & ChrW(417) & "/" & ChrW(417) & "/" & ChrW(417) & "/u/u/u/u/u/" & ChrW(432) & "/" & ChrW(432) & "/" & ChrW(432) & "/" & ChrW(432) & "/" & ChrW(432) & "/" & ChrW(432) & "/y/y/y/y/y/" & ChrW(273) & "/A/A/A/A/A/" & ChrW(258) & "/" & ChrW(258) & "/" & ChrW(258) & "/" & ChrW(258) & "/" & ChrW(258) & "/" & ChrW(258) & "/Â/Â/Â/Â/Â/Â/E/E/E/E/E/Ê/Ê/Ê/Ê/Ê/Ê/I/I/I/I/I/O/O/O/O/O/Ô/Ô/Ô/Ô/Ô/Ô/" & ChrW(416) & "/" & ChrW(416) & "/" & ChrW(416) & "/" & ChrW(416) & "/" & ChrW(416) & "/" & ChrW(416) & "/U/U/U/U/U/" & ChrW(431) & "/" & ChrW(431) & "/" & ChrW(431) & "/" & ChrW(431) & "/" & ChrW(431) & "/" & ChrW(431) & "/Y/Y/Y/Y/Y/" & ChrW(272)
UnicodeDS: z(2) = Join(f, "/")
UnicodeTH: z(3) = Join(g, "/")
TCVN3: z(4) = "¸/µ/¶/·/¹/¨/¾/»/¼/½/Æ/©/Ê/Ç/È/É/Ë/Ð/Ì/Î/Ï/Ñ/ª/Õ/Ò/Ó/Ô/Ö/Ý/×/Ø/Ü/Þ/ã/ß/á/â/ä/«/è/å/æ/ç/é/¬/í/ê/ë/ì/î/ó/ï/ñ/ò/ô//ø/õ/ö/÷/ù/ý/ú/û/ü/þ/®/¸/µ/¶/·/¹/¡/¾/»/¼/½/Æ/¢/Ê/Ç/È/É/Ë/Ð/Ì/Î/Ï/Ñ/£/Õ/Ò/Ó/Ô/Ö/Ý/×/Ø/Ü/Þ/ã/ß/á/â/ä/¤/è/å/æ/ç/é/¥/í/ê/ë/ì/î/ó/ï/ñ/ò/ô/¦/ø/õ/ö/÷/ù/ý/ú/û/ü/þ/§"
VISCII: z(5) = "á/à/ä/ã/Õ/å/¡/¢/Æ/Ç/£/â/¤/¥/¦/ç/§/é/è/ë/¨/©/ê/ª/«/¬//®/í/ì/ï/î/¸/ó/ò/ö/õ/÷/ô/¯/°/±/²/µ/½/¾/¶/·/Þ/þ/ú/ù/ü/û/ø/ß/Ñ/×/Ø/æ/ñ/ý/Ï/Ö/Û/Ü/ð/Á/À/Ä/Ã/€/Å//‚/Æ/Ç/ƒ/Â/„/…/†/ç/‡/É/È/Ë/ˆ/‰/Ê/Š/‹/Œ//Ž/Í/Ì/›/Î/˜/Ó/Ò/™/õ/š/Ô///‘/’/“/´/•/–/—/³/”/Ú/Ù/œ//ž/¿/º/»/¼/ÿ/¹/Ý/Ÿ/Ö/Û/Ü/Ð"
VPS: z(6) = "á/à/ä/ã/å/æ/¡/¢/£/¤/¥/â/Ã/À/Ä/Å/Æ/é/è/È/ë/Ë/ê/‰/Š/‹/Í/Œ/í/ì/Ì/ï/Î/ó/ò/Õ/õ/†/ô/Ó/Ò/°/‡/¶/Ö/§/©/ª/«/®/ú/ù/û/Û/ø/Ü/Ù/Ø/º/»/¿/š/ÿ/›/Ï/œ/Ç/Á/€//‚/å/ˆ//Ž//ð/¥/Â/ƒ/„/…/Å/Æ/É/×/Þ/þ/Ë/Ê//“/”/•/Œ/´/µ/·/¸/Î/¹/¼/½/¾/†/Ô/–/—/˜/™/¶/÷//ž/Ÿ/¦/®/Ú/¨/Ñ/¬/ø/Ð//¯/±/»/¿/Ý/²/ý/³/œ/ñ"
BKHCM1: z(7) = "¾/¿/À/Á/Â/×/Ø/Ù/Ú/Û/Ü/Ý/Þ/ß/à/á/â/Ã/Ä/Å/Æ/Ç/ã/ä/å/æ/ç/è/È/É/Ê/Ë/Ì/Í/Î/Ï/Ð/Ñ/é/ê/ë/ì/í/î/ï/ð/ñ/ò/ó/ô/Ò/Ó/Ô/Õ/Ö/õ/ö/÷/ø/ù/ú/û/ü/ý/þ/ÿ/½/€//‚/ƒ/„/™/š/›/œ//˜/Ÿ/~/¡/¢/£/¤/…/†/‡/ˆ/‰/¥/¦/§/¨/©/ª/Š/‹/Œ//Ž///‘/’/“/«/¬//®/¯/°/±/²/³/´/µ/¶/”/•/–/—/˜/·/¸/¹/º/»/¼/{/^/`/|/Ž/}"
BKHCM2: z(8) = "aá/aâ/aã/aä/aå/ù/ùæ/ùç/ùè/ùé/ùå/ê/êë/êì/êí/êî/êå/eá/eâ/eã/eä/eå/ï/ïë/ïì/ïí/ïî/ïå/ñ/ò/ó/ô/õ/oá/oâ/oã/oä/oå/ö/öë/öì/öí/öî/öå/ú/úá/úâ/úã/úä/úå/uá/uâ/uã/uä/uå/û/ûá/ûâ/ûã/ûä/ûå/yá/yâ/yã/yä/yå/à/AÁ/AÂ/AÃ/AÄ/AÅ/Ù/ÙÆ/ÙÇ/ÙÈ/ÙÉ/ÙÅ/Ê/ÊË/ÊÌ/ÊÍ/ÊÎ/ÊÅ/EÁ/EÂ/EÃ/EÄ/EÅ/Ï/ÏË/ÏÌ/ÏÍ/ÏÎ/Ïå/Ñ/Ò/Ó/Ô/Õ/OÁ/OÂ/OÃ/OÄ/OÅ/Ö/ÖË/ÖÌ/ÖÍ/ÖÎ/ÖÅ/Ú/ÚÁ/ÚÂ/ÚÃ/ÚÄ/ÚÅ/UÁ/UÂ/UÃ/UÄ/UÅ/Û/ÛÁ/ÛÂ/ÛÃ/ÛÄ/ÛÅ/YÁ/YÂ/YÃ/YÄ/YÅ/À"
VietwareF: z(9) = "À/ª/¶/º/Á/Ÿ/Å/Â/Ã/Ä/Æ/¡/Ê/Ç/È/É/Ë/Ï/Ì/Í/Î/Ñ/£/Õ/Ò/Ó/Ô/Ö/Û/Ø/Ù/Ú/Ü/â/ß/à/á/ã/¤/ç/ä/å/æ/è/¥/ì/é/ê/ë/í/ò/î/ï/ñ/ó/§/÷/ô/õ/ö/ø/ü/ù/ú/û/ÿ/¢/À/ª/¶/º/Á/–/Å/Â/Ã/Ä/Æ/—/Ê/Ç/È/É/Ë/Ï/Ì/Í/Î/Ñ/™/Õ/Ò/Ó/Ô/Ö/Û/Ø/Ù/Ú/Ü/â/ß/à/á/ã/š/ç/ä/å/æ/è/›/ì/é/ê/ë/í/ò/î/ï/ñ/ó/œ/÷/ô/õ/ö/ø/ü/ù/ú/û/ÿ/˜"
VietwareX: z(10) = "aï/aì/aí/aî/aû/à/àõ/àò/àó/àô/àû/á/áú/áö/áø/áù/áû/eï/eì/eí/eî/eû/ã/ãú/ãö/ãø/ãù/ãû/ê/ç/è/é/ë/oï/oì/oí/oî/oü/ä/äú/äö/äø/äù/äü/å/åï/åì/åí/åî/åü/uï/uì/uí/uî/uû/æ/æï/æì/æí/æî/æû/yï/yì/yí/yî/yñ/â/AÏ/AÌ/AÍ/AÎ/AÛ/À/ÀÕ/ÀÒ/ÀÓ/ÀÔ/ÀÛ/Á/ÁÚ/ÁÖ/ÁØ/ÁÙ/ÁÛ/EÏ/EÌ/EÍ/EÎ/EÛ/Ã/ÃÚ/ÃÖ/ÃØ/ÃÙ/ÃÛ/Ê/Ç/È/É/Ë/OÏ/OÌ/OÍ/OÎ/OÜ/Ä/ÄÚ/ÄÖ/ÄØ/ÄÙ/ÄÜ/Å/ÅÏ/ÅÌ/ÅÍ/ÅÎ/ÅÜ/UÏ/UÌ/UÍ/UÎ/UÛ/Æ/ÆÏ/ÆÌ/ÆÍ/ÆÎ/ÆÛ/YÏ/YÌ/YÍ/YÎ/YÑ/Â"
VniWin: z(11) = "aù/aø/aû/aõ/aï/aê/aé/aè/aú/aü/aë/aâ/aá/aà/aå/aã/aä/eù/eø/eû/eõ/eï/eâ/eá/eà/eå/eã/eä/í/ì/æ/ó/ò/où/oø/oû/oõ/oï/oâ/oá/oà/oå/oã/oä/ô/ôù/ôø/ôû/ôõ/ôï/uù/uø/uû/uõ/uï/ö/öù/öø/öû/öõ/öï/yù/yø/yû/yõ/î/ñ/AÙ/AØ/AÛ/AÕ/AÏ/AÊ/AÉ/AÈ/AÚ/AÜ/AË/AÂ/AÁ/AÀ/AÅ/AÃ/AÄ/EÙ/EØ/EÛ/EÕ/EÏ/EÂ/EÁ/EÀ/EÅ/EÃ/EÄ/Í/Ì/Æ/Ó/Ò/OÙ/OØ/OÛ/OÕ/OÏ/OÂ/OÁ/OÀ/OÅ/OÃ/OÄ/Ô/ÔÙ/ÔØ/ÔÛ/ÔÕ/ÔÏ/UÙ/UØ/UÛ/UÕ/UÏ/Ö/ÖÙ/ÖØ/ÖÛ/ÖÕ/ÖÏ/YÙ/YØ/YÛ/YÕ/Î/Ñ"
VNU: z(12) = "Ÿ/¡/¨/¬//¯/°/±/²/³/´/µ/¶/·/¸/¹/º/¾/¿/À/Á/Â/Å/Æ/Ë/Ì/Í/Î/Ï/Ö/×/Ø/Ù/Ü/Ý/Þ/ß/à/á/â/ã/ä/å/æ/ç/è/é/ê/ë/ì/î/ï/ð/ñ/ò/õ/ö/÷/ø/ù/ú/û/ü/ý/þ/ÿ/½/€/" & ChrW(129) & "/‚/Ã/" & ChrW(7840) & "/ƒ/" & ChrW(7854) & "/" & ChrW(7856) & "/" & ChrW(7858) & "/" & ChrW(7860) & "/" & ChrW(7862) & "/„/…/" & ChrW(7846) & "/" & ChrW(7848) & "/" & ChrW(6) & "/" & ChrW(7852) & "/É/È/" & ChrW(7866) & "/" & ChrW(7868) & "/" & ChrW(7864) & "/‰/" & ChrW(7870) & "/" & ChrW(7872) & "/" & ChrW(7874) & "/" & _
ChrW(7876) & "/" & ChrW(7878) & "/Í/Ì/" & ChrW(7880) & "/" & ChrW(296) & "/" & ChrW(7882) & "/Œ/Ò/" & ChrW(7886) & "/Õ/" & ChrW(7884) & "/" & ChrW(141) & "/" & ChrW(7888) & "/" & ChrW(7890) & "/" & ChrW(7892) & "/" & ChrW(7894) & "/" & ChrW(7896) & "/" & ChrW(381) & "/" & ChrW(7898) & "/" & ChrW(7900) & "/" & ChrW(143) & "/" & ChrW(7904) & "/" & ChrW(7906) & "/˜/Ù/™/" & ChrW(360) & "/" & ChrW(7908) & "/œ/" & ChrW(157) & "/" & ChrW(7914) & "/" & ChrW(7916) & "/" & ChrW(7918) & "/" & ChrW(7920) & "/" & ChrW(382) & "/" & ChrW(7922) & "/" & ChrW(7926) & "/" & ChrW(7928) & "/" & ChrW(7924) & "/" & ChrW(272)
VIQR: z(13) = "a'/a`/a?/a~/a./a(/a('/a(`/a(?/a(~/a(./a^/a^'/a^`/a^?/a^~/a^./e'/e`/e?/e~/e./e^/e^'/e^`/e^?/e^~/e^./i'/i`/i?/i~/i./o'/o`/o?/o~/o./o^/o^'/o^`/o^?/o^~/o^./o+/o+'/o+`/o+?/o+~/o+./u'/u`/u?/u~/u./u+/u+'/u+`/u+?/u+~/u+./y'/y`/y?/y~/y./d-/A'/A`/A?/A~/A./A(/A('/A(`/A(?/A(~/A(./A^/A^'/A^`/A^?/A^~/A^./E'/E`/E?/E~/E./E^/E^'/E^`/E^?/E^~/E^./I'/I`/I?/I~/I./O'/O`/O?/O~/O./O^/O^'/O^`/O^?/O^~/O^./O+/O+'/O+`/O+?/O+~/O+./U'/U`/U?/U~/U./U+/U+'/U+`/U+?/U+~/U+./Y'/Y`/Y?/Y~/Y./DD"
UTF8: z(14) = "á/à /ả/ã/ạ/ă/ắ/ằ/ẳ/ẵ/ặ/â/ấ/ầ/ẩ/ẫ/áº/é/è/ẻ/ẽ/ẹ/ê/ế/á»/ể/á»…/ệ/Ã/ì/ỉ/Ä©/ị/ó/ò/á»/õ/á»/ô/ố/ồ/ổ/á»—/á»™/Æ¡/á»›/á»/ở/ỡ/ợ/ú/ù/ủ/Å©/ụ/Æ°/ứ/ừ/á»/ữ/á»±/ý/ỳ/á»·/ỹ/ỵ/Ä‘/Ã/À/Ả/Ã/Ạ/Ä‚/Ắ/Ằ/Ẳ/Ẵ/Ặ/Â/Ấ/Ầ/Ẩ/Ẫ/Ậ/É/È/Ẻ/Ẽ/Ẹ/Ê/Ế/Ề/Ể/Ễ/Ệ/Ã/ÃŒ/Ỉ/Ĩ/Ị/Ó/Ã’/Ỏ/Õ/Ọ/Ô/á»/á»’/á»”/á»–/Ộ/Æ /Ớ/Ờ/Ở/á» /Ợ/Ú/Ù/Ủ/Ũ/Ụ/Ư/Ứ/Ừ/Ử/á»®/á»°/Ã/Ỳ/Ỷ/Ỹ/á»´/Ä/"
WinCP1258: z(15) = "á/à/aÒ/aÞ/aò/ã/ãì/ãÌ/ãÒ/ãÞ/ãò/â/âì/âÌ/âÒ/âÞ/âò/é/è/eÒ/eÞ/eò/ê/êì/êÌ/êÒ/êÞ/êò/í/iÌ/iÒ/iÞ/iò/ó/oÌ/oÒ/oÞ/oò/ô/ôì/ôÌ/ôÒ/ôÞ/ôò/õ/õì/õÌ/õÒ/õÞ/õò/ú/ù/uÒ/uÞ/uò/ý/ýì/ýÌ/ýÒ/ýÞ/ýò/yì/yÌ/yÒ/yÞ/yò/ð/Á/À/AÒ/AÞ/Aò/Ã/Ãì/ÃÌ/ÃÒ/ÃÞ/Ãò/Â/Âì/ÂÌ/ÂÒ/ÂÞ/Âò/É/È/EÒ/EÞ/Eò/Ê/Êì/ÊÌ/ÊÒ/ÊÞ/Êò/Í/IÌ/IÒ/IÞ/Iò/Ó/OÌ/OÒ/OÞ/Oò/Ô/Ôì/ÔÌ/ÔÒ/ÔÞ/Ôò/Õ/Õì/ÕÌ/ÕÒ/ÕÞ/Õò/Ú/Ù/UÒ/UÞ/Uò/Ý/Ýì/ÝÌ/ÝÒ/ÝÞ/Ýò/Yì/YÌ/YÒ/YÞ/Yò/Ð"
VNICodes = z
Erase z
End Function
Public Enum ConvertType
TCVN2Unicode = 0
VNIWIN2Unicode = 1
Unicode2TCVN = 2
Unicode2VNIWin = 3
VNI2TCVN = 4
TCVN2VNI = 5
UniCp2Uni = 6
Uni2UniCp = 7
End Enum
Private IsInitialised As Boolean ' bien nay dung de khong can phai tai lai cac chuoi so sanh nua
Dim iUnicode As Variant ' array to keep unicode char set
Dim iTCVN As Variant ' array to keep TCVN char set
Dim iVNI As Variant ' array to keep TCVN char set
Dim iUniCp As Variant
Function VowelsToArray(CharVowels As String, Optional MuliChartype As Boolean = True) As Variant
' Put the multichar Vowels to an array
On Error GoTo errmsg
Dim i As Integer, j As Integer, mText As String '
Dim mTmpArr As Variant
' Send the text into an Array of 134 items
mText = CharVowels
If MuliChartype = True Then ' this is a multchar list
mTmpArr = Split(CharVowels, "/")
Else ' this is a single char
mTmpArr = Array(133)
For i = 1 To Len(mText)
' now extracting the list
mTmpArr(i - 1) = Mid(mText, i, 1) & CStr(i)
Next
End If
VowelsToArray = mTmpArr
Exit Function
errmsg:
MsgBox Err.Description & " " & j & Len(mText) & "//" & mText & "//"
End Function
Function GetUnicodeString() As String
' This function is no longer kept but I still would like it to be here for some folks if they want to diggest
Dim iUnicode As Variant ' array to keep unicode char set
Dim i As Long, iStr As String
iUnicode = Array(225, 224, 7843, 227, 7841, 259, 7855, 7857, 7859, 7861, 7863, 226, 7845, 7847, 7849, _
7851, 7853, 233, 232, 7867, 7869, 7865, 234, 7871, 7873, 7875, 7877, 7879, 237, 236, 7881, 297, 7883, _
243, 242, 7887, 245, 7885, 244, 7889, 7891, 7893, 7895, 7897, 417, 7899, 7901, 7903, 7905, 7907, 250, _
249, 7911, 361, 7909, 432, 7913, 7915, 7917, 7919, 7921, 253, 7923, 7927, 7929, 7925, 273, 193, 192, _
7842, 195, 7840, 258, 7854, 7856, 7858, 7860, 7862, 194, 7844, 7846, 7848, 7850, 7852, 201, 200, 7866, _
7868, 7864, 202, 7870, 7872, 7874, 7876, 7878, 205, 204, 7880, 296, 7882, 211, 210, 7886, 213, 7884, _
212, 7888, 7890, 7892, 7894, 7896, 416, 7898, 7900, 7902, 7904, 7906, 218, 217, 7910, 360, 7908, 431, _
7912, 7914, 7916, 7918, 7920, 221, 7922, 7926, 7928, 7924, 272)
For i = 0 To UBound(iUnicode)
iStr = iStr & "/" & ChrW(iUnicode(i))
Next
GetUnicodeString = Mid(iStr, 2)
End Function
Private Function Code2Char(txt As String) As Variant
' for converting code to char
Dim Arr1 As Variant, Arr2 As Variant, Arr3(133) As String
Dim i As Long, j As Long, Str As String
Arr1 = Split(txt, "/")
For i = 0 To UBound(Arr1)
Str = ""
Arr2 = Split(Arr1(i), ",")
For j = 0 To UBound(Arr2)
Str = Str & ChrW(Arr2(j))
Next
Arr3(i) = Str
Next
Code2Char = Arr3
End Function
Function ConvertText(txtString As String, Optional CodePage As ConvertType = 0) As String
' ham nay cho phep chuyen lan nhau tu Unicode sang VNI Windows, TCVN va nguoc lai - 6 cach chuyen
If txtString = "" Then
ConvertText = "''"
Exit Function
End If
Dim iStr As String, ProcStr As String, RevList As String
Dim i As Long, ElmNum As Long
Dim ProcList As Variant, ProcVar As Variant, SeedVar As Variant
Dim RevArr As Variant
Dim MultiChar As Boolean
iStr = txtString
If Not IsInitialised Then
IsInitialised = True
iUnicode = VowelsToArray(GetUnicodeString())
iVNI = VowelsToArray("aù/aø/aû/aõ/aï/aê/aé/aè/aú/aü/aë/aâ/aá/aà/aå/aã/aä/eù/eø/eû/eõ/eï/eâ/eá/eà/eå/" & _
"eã/eä/í/ì/æ/ó/ò/où/oø/oû/oõ/oï/oâ/oá/oà/oå/oã/oä/ô/ôù/ôø/ôû/ôõ/ôï/uù/uø/uû/uõ/uï/ö/" & _
"öù/öø/öû/öõ/öï/yù/yø/yû/yõ/î/ñ/AÙ/AØ/AÛ/AÕ/AÏ/AÊ/AÉ/AÈ/AÚ/AÜ/AË/AÂ/AÁ/AÀ/AÅ/AÃ/AÄ/EÙ/EØ/" & _
"EÛ/EÕ/EÏ/EÂ/EÁ/EÀ/EÅ/EÃ/EÄ/Í/Ì/Æ/Ó/Ò/OÙ/OØ/OÛ/OÕ/OÏ/OÂ/OÁ/OÀ/OÅ/OÃ/OÄ/Ô/ÔÙ/ÔØ/ÔÛ/ÔÕ/ÔÏ/" & _
"UÙ/UØ/UÛ/UÕ/UÏ/Ö/ÖÙ/ÖØ/ÖÛ/ÖÕ/ÖÏ/YÙ/YØ/YÛ/YÕ/Î/Ñ")
iTCVN = VowelsToArray("¸/µ/¶/·/¹/¨/¾/»/¼/½/Æ/©/Ê/Ç/È/É/Ë/Ð/Ì/Î/Ï/Ñ/ª/Õ/Ò/Ó/Ô/Ö/Ý/×/Ø/Ü/Þ/ã/ß/" & _
"á/â/ä/«/è/å/æ/ç/é/¬/í/ê/ë/ì/î/ó/ï/ñ/ò/ô//ø/õ/ö/÷/ù/ý/ú/û/ü/þ/®/¸/µ/¶/·/¹/¡/¾/»/¼/½/Æ/¢/Ê/" & _
"Ç/È/É/Ë/Ð/Ì/Î/Ï/Ñ/£/Õ/Ò/Ó/Ô/Ö/Ý/×/Ø/Ü/Þ/ã/ß/á/â/ä/¤/è/å/æ/ç/é/¥/í/ê/ë/ì/î/ó/ï/ñ/ò/ô/¦/ø/õ/ö" & _
"/÷/ù/ý/ú/û/ü/þ/§")
iUniCp = Code2Char("97,769/97,768/97,777/97,771/97,803/259/259,769/259,768/259,777/259,771/259,803/" & _
"226/226,769/226,768/226,777/226,771/226,803/101,769/101,768/101,777/101,771/101,803/234/234,769/" & _
"234,768/234,777/234,771/234,803/105,769/105,768/105,777/105,771/105,803/111,769/111,768/111,777/" & _
"111,771/111,803/244/244,769/244,768/244,777/244,771/244,803/417/417,769/417,768/417,777/417,771/" & _
"417,803/117,769/117,768/117,777/117,771/117,803/432/432,769/432,768/432,777/432,771/432,803/121,769/" & _
"121,768/121,777/121,771/121,803/273/65,769/65,768/65,777/65,771/65,803/258/258,769/258,768/258,777/" & _
"258,771/258,803/194/194,769/194,768/194,777/194,771/194,803/69,769/69,768/69,777/69,771/69,803/202/" & _
"202,769/202,768/202,777/202,771/202,803/73,769/73,768/73,777/73,771/73,803/79,769/79,768/79,777/" & _
"79,771/79,803/212/212,769/212,768/212,777/212,771/212,803/416/416,769/416,768/416,777/416,771/" & _
"416,803/85,769/85,768/85,777/85,771/85,803/431/431,769/431,768/431,777/431,771/431,803/89,769/" & _
"89,768/89,777/89,771/89,803/272")
End If
' Chon cach chuyen dua vao tham so
Select Case CodePage
Case 0: 'Tu TCVN sang Unicode
SeedVar = iTCVN
ProcVar = iUnicode
Case 1: 'Tu VNI san Unicode
SeedVar = iVNI
ProcVar = iUnicode
Case 2: 'Tu Unicode san TCVN
SeedVar = iUnicode
ProcVar = iTCVN
Case 3: 'Tu Unicode sang VNI
SeedVar = iUnicode
ProcVar = iVNI
Case 4: 'Tu VNI sang TCVN
SeedVar = iVNI
ProcVar = iTCVN
Case 5: 'Tu TCVN sang VNI
SeedVar = iTCVN
ProcVar = iVNI
Case 6: 'Tu Unicp sang Unicode
' forward conversion by default
SeedVar = iUniCp
ProcVar = iUnicode
Case 7: 'Tu Unicode sang Unicp
SeedVar = iUnicode
ProcVar = iUniCp
End Select
MultiChar = IIf(Len(SeedVar(i)) > 1, True, False)
' Diem yeu cua cach nay la luon chay qua 133 lenh cua bang ma tieng viet
' Dau tien chuyen cac chuoi ma co 2 ky tu truoc de tranh viec chuyen lap 2 lan
For i = 0 To UBound(SeedVar)
If MultiChar And Len(SeedVar(i)) = 1 Then
' Ok day la chuoi 1 ky tu trong bang ma 2 byte, bo qua, va ghi lai so thu tu cua no
RevList = RevList & "," & i
Else
If InStr(iStr, SeedVar(i)) > 0 Then
'Chi chuyen neu tim thay ky tu
iStr = Replace(iStr, SeedVar(i), "[[" & i & "]]")
ProcStr = ProcStr & ",[[" & i & "]]"
End If
End If
Next
' Thuc hien chuyen sang chuoi trung gian voi phan con lai
RevArr = Split(RevList, ",")
For i = 0 To UBound(RevArr)
ElmNum = Val(RevArr(i))
If InStr(iStr, SeedVar(ElmNum)) > 0 Then
'chi chuyen ma neu tim thay co doan chuoi tim duoc
iStr = Replace(iStr, SeedVar(ElmNum), "[[" & ElmNum & "]]")
ProcStr = ProcStr & ",[[" & ElmNum & "]]"
End If
Next
ProcList = Split(ProcStr, ",")
' Gio chuyen nguoc lai bang ma chuan
For i = 0 To UBound(ProcList)
If ProcList(i) <> "" Then
ElmNum = Val(Mid(ProcList(i), 3))
iStr = Replace(iStr, ProcList(i), ProcVar(ElmNum))
End If
Next
' gio phai loai bo cac loi ky tu trong chuoi vi du dau "'" co the làm SQL bi loi
ConvertText = iStr 'Replace(iStr, "'", "''")
End Function
Vấn đề này thú vị nhưng quá hiếm khi gặp. Hóng chủ thớt chạy thử có ổn không.Bài này phải phối hợp nhiều code của các bác đã làm sẳn trên GPE này.
Cách tôi làm là:
- Duyệt từng dòng, chạy code để tìm ra nó dùng bảng mã gì.
- Sau khi tìm ra thì dùng hàm chuyển đổi từng loại bảng mã sang Unicode.
Nếu xử lý mấy ngàn dòng, thì không biết nó chạy bao lâu.
Code xác định bảng mã: dùng code của bạn Hesanbi (link)
Mã:Function detectVNICode(ByVal Text$) As Integer On Error Resume Next If Text = vbNullString Then Exit Function End If Dim z, i%, j%, sp, A(), m&, n&, X% z = VNICodes For i = 2 To UBound(z) n = 0 sp = Split(z(i), "/") For j = LBound(sp) To UBound(sp) n = n - (Text Like "*" & sp(j) & "*") Next If n > m Then m = n: X = i End If Next detectVNICode = X End Function Function VNICodes() 'https://en.wikipedia.org/wiki/Byte_order_mark Const n_ = vbNullString Dim A$, b$, c$, d$, E$, f, g, H, i%, z(18) A = ChrW(&H300): b = ChrW(&H301): c = ChrW(&H303): d = ChrW(&H309): E = ChrW(&H323) f = VBA.Array(225, 224, 7843, 227, 7841, 259, 7855, 7857, 7859, 7861, 7863, 226, 7845, 7847, 7849, 7851, 7853, 233, 232, 7867, 7869, 7865, 234, 7871, 7873, 7875, 7877, 7879, 237, 236, 7881, 297, 7883, 243, 242, 7887, 245, 7885, 244, 7889, 7891, 7893, 7895, 7897, 417, 7899, 7901, 7903, 7905, 7907, 250, 249, 7911, 361, 7909, 432, 7913, 7915, 7917, 7919, 7921, 253, 7923, 7927, 7929, 7925, 273, 193, 192, 7842, 195, 7840, 258, 7854, 7856, 7858, 7860, 7862, 194, 7844, 7846, 7848, 7850, 7852, 201, 200, 7866, 7868, 7864, 202, 7870, 7872, 7874, 7876, 7878, 205, 204, 7880, 296, 7882, 211, 210, 7886, 213, 7884, 212, 7888, 7890, 7892, 7894, 7896, 416, 7898, 7900, 7902, 7904, 7906, 218, 217, 7910, 360, 7908, 431, 7912, 7914, 7916, 7918, 7920, 221, 7922, 7926, 7928, 7924, 272) g = VBA.Array(97, 97, 97, 97, 97, 259, 259, 259, 259, 259, 259, 226, 226, 226, 226, 226, 226, 101, 101, 101, 101, 101, 234, 234, 234, 234, 234, 234, 105, 105, 105, 105, 105, 111, 111, 111, 111, 111, 244, 244, 244, 244, 244, 244, 417, 417, 417, 417, 417, 417, 117, 117, 117, 117, 117, 432, 432, 432, 432, 432, 432, 121, 121, 121, 121, 121, 273, 65, 65, 65, 65, 65, 258, 258, 258, 258, 258, 258, 194, 194, 194, 194, 194, 194, 69, 69, 69, 69, 69, 202, 202, 202, 202, 202, 202, 73, 73, 73, 73, 73, 79, 79, 79, 79, 79, 212, 212, 212, 212, 212, 212, 416, 416, 416, 416, 416, 416, 85, 85, 85, 85, 85, 431, 431, 431, 431, 431, 431, 89, 89, 89, 89, 89, 272) H = VBA.Array(b, A, d, c, E, n_, b, A, d, c, E, n_, b, A, d, c, E, b, A, d, c, E, n_, b, A, d, c, E, b, A, d, c, E, b, A, d, c, E, n_, b, A, d, c, E, n_, b, A, d, c, E, b, A, d, c, E, n_, b, A, d, c, E, b, A, d, c, E, n_, b, A, d, c, E, n_, b, A, d, c, E, n_, b, A, d, c, E, b, A, d, c, E, n_, b, A, d, c, E, b, A, d, c, E, b, A, d, c, E, n_, b, A, d, c, E, n_, b, A, d, c, E, b, A, d, c, E, n_, b, A, d, c, E, b, A, d, c, E, n_) UnicodeHex: z(16) = f DecimalNCRs: z(17) = f HexNCRs: z(18) = f For i = LBound(f) To UBound(f) A = Hex(f(i)) A = String(4 - Len(A), "0") & A z(16)(i) = "\u" & A z(17)(i) = "&#" & f(i) & ";" z(18)(i) = "&#x" & A & ";" f(i) = ChrW(f(i)) g(i) = ChrW(g(i)) & H(i) Next NotMask1: z(0) = "a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/e/e/e/e/e/e/e/e/e/e/e/i/i/i/i/i/o/o/o/o/o/o/o/o/o/o/o/o/o/o/o/o/o/u/u/u/u/u/u/u/u/u/u/u/y/y/y/y/y/d/A/A/A/A/A/A/A/A/A/A/A/A/A/A/A/A/A/E/E/E/E/E/E/E/E/E/E/E/I/I/I/I/I/O/O/O/O/O/O/O/O/O/O/O/O/O/O/O/O/O/U/U/U/U/U/U/U/U/U/U/U/Y/Y/Y/Y/Y/D" NotMask2: z(1) = "a/a/a/a/a/" & ChrW(259) & "/" & ChrW(259) & "/" & ChrW(259) & "/" & ChrW(259) & "/" & ChrW(259) & "/" & ChrW(259) & "/â/â/â/â/â/â/e/e/e/e/e/ê/ê/ê/ê/ê/ê/i/i/i/i/i/o/o/o/o/o/ô/ô/ô/ô/ô/ô/" & ChrW(417) & "/" & ChrW(417) & "/" & ChrW(417) & "/" & ChrW(417) & "/" & ChrW(417) & "/" & ChrW(417) & "/u/u/u/u/u/" & ChrW(432) & "/" & ChrW(432) & "/" & ChrW(432) & "/" & ChrW(432) & "/" & ChrW(432) & "/" & ChrW(432) & "/y/y/y/y/y/" & ChrW(273) & "/A/A/A/A/A/" & ChrW(258) & "/" & ChrW(258) & "/" & ChrW(258) & "/" & ChrW(258) & "/" & ChrW(258) & "/" & ChrW(258) & "/Â/Â/Â/Â/Â/Â/E/E/E/E/E/Ê/Ê/Ê/Ê/Ê/Ê/I/I/I/I/I/O/O/O/O/O/Ô/Ô/Ô/Ô/Ô/Ô/" & ChrW(416) & "/" & ChrW(416) & "/" & ChrW(416) & "/" & ChrW(416) & "/" & ChrW(416) & "/" & ChrW(416) & "/U/U/U/U/U/" & ChrW(431) & "/" & ChrW(431) & "/" & ChrW(431) & "/" & ChrW(431) & "/" & ChrW(431) & "/" & ChrW(431) & "/Y/Y/Y/Y/Y/" & ChrW(272) UnicodeDS: z(2) = Join(f, "/") UnicodeTH: z(3) = Join(g, "/") TCVN3: z(4) = "¸/µ/¶/·/¹/¨/¾/»/¼/½/Æ/©/Ê/Ç/È/É/Ë/Ð/Ì/Î/Ï/Ñ/ª/Õ/Ò/Ó/Ô/Ö/Ý/×/Ø/Ü/Þ/ã/ß/á/â/ä/«/è/å/æ/ç/é/¬/í/ê/ë/ì/î/ó/ï/ñ/ò/ô//ø/õ/ö/÷/ù/ý/ú/û/ü/þ/®/¸/µ/¶/·/¹/¡/¾/»/¼/½/Æ/¢/Ê/Ç/È/É/Ë/Ð/Ì/Î/Ï/Ñ/£/Õ/Ò/Ó/Ô/Ö/Ý/×/Ø/Ü/Þ/ã/ß/á/â/ä/¤/è/å/æ/ç/é/¥/í/ê/ë/ì/î/ó/ï/ñ/ò/ô/¦/ø/õ/ö/÷/ù/ý/ú/û/ü/þ/§" VISCII: z(5) = "á/à/ä/ã/Õ/å/¡/¢/Æ/Ç/£/â/¤/¥/¦/ç/§/é/è/ë/¨/©/ê/ª/«/¬//®/í/ì/ï/î/¸/ó/ò/ö/õ/÷/ô/¯/°/±/²/µ/½/¾/¶/·/Þ/þ/ú/ù/ü/û/ø/ß/Ñ/×/Ø/æ/ñ/ý/Ï/Ö/Û/Ü/ð/Á/À/Ä/Ã/€/Å//‚/Æ/Ç/ƒ/Â/„/…/†/ç/‡/É/È/Ë/ˆ/‰/Ê/Š/‹/Œ//Ž/Í/Ì/›/Î/˜/Ó/Ò/™/õ/š/Ô///‘/’/“/´/•/–/—/³/”/Ú/Ù/œ//ž/¿/º/»/¼/ÿ/¹/Ý/Ÿ/Ö/Û/Ü/Ð" VPS: z(6) = "á/à/ä/ã/å/æ/¡/¢/£/¤/¥/â/Ã/À/Ä/Å/Æ/é/è/È/ë/Ë/ê/‰/Š/‹/Í/Œ/í/ì/Ì/ï/Î/ó/ò/Õ/õ/†/ô/Ó/Ò/°/‡/¶/Ö/§/©/ª/«/®/ú/ù/û/Û/ø/Ü/Ù/Ø/º/»/¿/š/ÿ/›/Ï/œ/Ç/Á/€//‚/å/ˆ//Ž//ð/¥/Â/ƒ/„/…/Å/Æ/É/×/Þ/þ/Ë/Ê//“/”/•/Œ/´/µ/·/¸/Î/¹/¼/½/¾/†/Ô/–/—/˜/™/¶/÷//ž/Ÿ/¦/®/Ú/¨/Ñ/¬/ø/Ð//¯/±/»/¿/Ý/²/ý/³/œ/ñ" BKHCM1: z(7) = "¾/¿/À/Á/Â/×/Ø/Ù/Ú/Û/Ü/Ý/Þ/ß/à/á/â/Ã/Ä/Å/Æ/Ç/ã/ä/å/æ/ç/è/È/É/Ê/Ë/Ì/Í/Î/Ï/Ð/Ñ/é/ê/ë/ì/í/î/ï/ð/ñ/ò/ó/ô/Ò/Ó/Ô/Õ/Ö/õ/ö/÷/ø/ù/ú/û/ü/ý/þ/ÿ/½/€//‚/ƒ/„/™/š/›/œ//˜/Ÿ/~/¡/¢/£/¤/…/†/‡/ˆ/‰/¥/¦/§/¨/©/ª/Š/‹/Œ//Ž///‘/’/“/«/¬//®/¯/°/±/²/³/´/µ/¶/”/•/–/—/˜/·/¸/¹/º/»/¼/{/^/`/|/Ž/}" BKHCM2: z(8) = "aá/aâ/aã/aä/aå/ù/ùæ/ùç/ùè/ùé/ùå/ê/êë/êì/êí/êî/êå/eá/eâ/eã/eä/eå/ï/ïë/ïì/ïí/ïî/ïå/ñ/ò/ó/ô/õ/oá/oâ/oã/oä/oå/ö/öë/öì/öí/öî/öå/ú/úá/úâ/úã/úä/úå/uá/uâ/uã/uä/uå/û/ûá/ûâ/ûã/ûä/ûå/yá/yâ/yã/yä/yå/à/AÁ/AÂ/AÃ/AÄ/AÅ/Ù/ÙÆ/ÙÇ/ÙÈ/ÙÉ/ÙÅ/Ê/ÊË/ÊÌ/ÊÍ/ÊÎ/ÊÅ/EÁ/EÂ/EÃ/EÄ/EÅ/Ï/ÏË/ÏÌ/ÏÍ/ÏÎ/Ïå/Ñ/Ò/Ó/Ô/Õ/OÁ/OÂ/OÃ/OÄ/OÅ/Ö/ÖË/ÖÌ/ÖÍ/ÖÎ/ÖÅ/Ú/ÚÁ/ÚÂ/ÚÃ/ÚÄ/ÚÅ/UÁ/UÂ/UÃ/UÄ/UÅ/Û/ÛÁ/ÛÂ/ÛÃ/ÛÄ/ÛÅ/YÁ/YÂ/YÃ/YÄ/YÅ/À" VietwareF: z(9) = "À/ª/¶/º/Á/Ÿ/Å/Â/Ã/Ä/Æ/¡/Ê/Ç/È/É/Ë/Ï/Ì/Í/Î/Ñ/£/Õ/Ò/Ó/Ô/Ö/Û/Ø/Ù/Ú/Ü/â/ß/à/á/ã/¤/ç/ä/å/æ/è/¥/ì/é/ê/ë/í/ò/î/ï/ñ/ó/§/÷/ô/õ/ö/ø/ü/ù/ú/û/ÿ/¢/À/ª/¶/º/Á/–/Å/Â/Ã/Ä/Æ/—/Ê/Ç/È/É/Ë/Ï/Ì/Í/Î/Ñ/™/Õ/Ò/Ó/Ô/Ö/Û/Ø/Ù/Ú/Ü/â/ß/à/á/ã/š/ç/ä/å/æ/è/›/ì/é/ê/ë/í/ò/î/ï/ñ/ó/œ/÷/ô/õ/ö/ø/ü/ù/ú/û/ÿ/˜" VietwareX: z(10) = "aï/aì/aí/aî/aû/à/àõ/àò/àó/àô/àû/á/áú/áö/áø/áù/áû/eï/eì/eí/eî/eû/ã/ãú/ãö/ãø/ãù/ãû/ê/ç/è/é/ë/oï/oì/oí/oî/oü/ä/äú/äö/äø/äù/äü/å/åï/åì/åí/åî/åü/uï/uì/uí/uî/uû/æ/æï/æì/æí/æî/æû/yï/yì/yí/yî/yñ/â/AÏ/AÌ/AÍ/AÎ/AÛ/À/ÀÕ/ÀÒ/ÀÓ/ÀÔ/ÀÛ/Á/ÁÚ/ÁÖ/ÁØ/ÁÙ/ÁÛ/EÏ/EÌ/EÍ/EÎ/EÛ/Ã/ÃÚ/ÃÖ/ÃØ/ÃÙ/ÃÛ/Ê/Ç/È/É/Ë/OÏ/OÌ/OÍ/OÎ/OÜ/Ä/ÄÚ/ÄÖ/ÄØ/ÄÙ/ÄÜ/Å/ÅÏ/ÅÌ/ÅÍ/ÅÎ/ÅÜ/UÏ/UÌ/UÍ/UÎ/UÛ/Æ/ÆÏ/ÆÌ/ÆÍ/ÆÎ/ÆÛ/YÏ/YÌ/YÍ/YÎ/YÑ/Â" VniWin: z(11) = "aù/aø/aû/aõ/aï/aê/aé/aè/aú/aü/aë/aâ/aá/aà/aå/aã/aä/eù/eø/eû/eõ/eï/eâ/eá/eà/eå/eã/eä/í/ì/æ/ó/ò/où/oø/oû/oõ/oï/oâ/oá/oà/oå/oã/oä/ô/ôù/ôø/ôû/ôõ/ôï/uù/uø/uû/uõ/uï/ö/öù/öø/öû/öõ/öï/yù/yø/yû/yõ/î/ñ/AÙ/AØ/AÛ/AÕ/AÏ/AÊ/AÉ/AÈ/AÚ/AÜ/AË/AÂ/AÁ/AÀ/AÅ/AÃ/AÄ/EÙ/EØ/EÛ/EÕ/EÏ/EÂ/EÁ/EÀ/EÅ/EÃ/EÄ/Í/Ì/Æ/Ó/Ò/OÙ/OØ/OÛ/OÕ/OÏ/OÂ/OÁ/OÀ/OÅ/OÃ/OÄ/Ô/ÔÙ/ÔØ/ÔÛ/ÔÕ/ÔÏ/UÙ/UØ/UÛ/UÕ/UÏ/Ö/ÖÙ/ÖØ/ÖÛ/ÖÕ/ÖÏ/YÙ/YØ/YÛ/YÕ/Î/Ñ" VNU: z(12) = "Ÿ/¡/¨/¬//¯/°/±/²/³/´/µ/¶/·/¸/¹/º/¾/¿/À/Á/Â/Å/Æ/Ë/Ì/Í/Î/Ï/Ö/×/Ø/Ù/Ü/Ý/Þ/ß/à/á/â/ã/ä/å/æ/ç/è/é/ê/ë/ì/î/ï/ð/ñ/ò/õ/ö/÷/ø/ù/ú/û/ü/ý/þ/ÿ/½/€/" & ChrW(129) & "/‚/Ã/" & ChrW(7840) & "/ƒ/" & ChrW(7854) & "/" & ChrW(7856) & "/" & ChrW(7858) & "/" & ChrW(7860) & "/" & ChrW(7862) & "/„/…/" & ChrW(7846) & "/" & ChrW(7848) & "/" & ChrW(6) & "/" & ChrW(7852) & "/É/È/" & ChrW(7866) & "/" & ChrW(7868) & "/" & ChrW(7864) & "/‰/" & ChrW(7870) & "/" & ChrW(7872) & "/" & ChrW(7874) & "/" & _ ChrW(7876) & "/" & ChrW(7878) & "/Í/Ì/" & ChrW(7880) & "/" & ChrW(296) & "/" & ChrW(7882) & "/Œ/Ò/" & ChrW(7886) & "/Õ/" & ChrW(7884) & "/" & ChrW(141) & "/" & ChrW(7888) & "/" & ChrW(7890) & "/" & ChrW(7892) & "/" & ChrW(7894) & "/" & ChrW(7896) & "/" & ChrW(381) & "/" & ChrW(7898) & "/" & ChrW(7900) & "/" & ChrW(143) & "/" & ChrW(7904) & "/" & ChrW(7906) & "/˜/Ù/™/" & ChrW(360) & "/" & ChrW(7908) & "/œ/" & ChrW(157) & "/" & ChrW(7914) & "/" & ChrW(7916) & "/" & ChrW(7918) & "/" & ChrW(7920) & "/" & ChrW(382) & "/" & ChrW(7922) & "/" & ChrW(7926) & "/" & ChrW(7928) & "/" & ChrW(7924) & "/" & ChrW(272) VIQR: z(13) = "a'/a`/a?/a~/a./a(/a('/a(`/a(?/a(~/a(./a^/a^'/a^`/a^?/a^~/a^./e'/e`/e?/e~/e./e^/e^'/e^`/e^?/e^~/e^./i'/i`/i?/i~/i./o'/o`/o?/o~/o./o^/o^'/o^`/o^?/o^~/o^./o+/o+'/o+`/o+?/o+~/o+./u'/u`/u?/u~/u./u+/u+'/u+`/u+?/u+~/u+./y'/y`/y?/y~/y./d-/A'/A`/A?/A~/A./A(/A('/A(`/A(?/A(~/A(./A^/A^'/A^`/A^?/A^~/A^./E'/E`/E?/E~/E./E^/E^'/E^`/E^?/E^~/E^./I'/I`/I?/I~/I./O'/O`/O?/O~/O./O^/O^'/O^`/O^?/O^~/O^./O+/O+'/O+`/O+?/O+~/O+./U'/U`/U?/U~/U./U+/U+'/U+`/U+?/U+~/U+./Y'/Y`/Y?/Y~/Y./DD" UTF8: z(14) = "á/à /ả/ã/ạ/ă/ắ/ằ/ẳ/ẵ/ặ/â/ấ/ầ/ẩ/ẫ/áº/é/è/ẻ/ẽ/ẹ/ê/ế/á»/ể/á»…/ệ/Ã/ì/ỉ/Ä©/ị/ó/ò/á»/õ/á»/ô/ố/ồ/ổ/á»—/á»™/Æ¡/á»›/á»/ở/ỡ/ợ/ú/ù/ủ/Å©/ụ/Æ°/ứ/ừ/á»/ữ/á»±/ý/ỳ/á»·/ỹ/ỵ/Ä‘/Ã/À/Ả/Ã/Ạ/Ä‚/Ắ/Ằ/Ẳ/Ẵ/Ặ/Â/Ấ/Ầ/Ẩ/Ẫ/Ậ/É/È/Ẻ/Ẽ/Ẹ/Ê/Ế/Ề/Ể/Ễ/Ệ/Ã/ÃŒ/Ỉ/Ĩ/Ị/Ó/Ã’/Ỏ/Õ/Ọ/Ô/á»/á»’/á»”/á»–/Ộ/Æ /Ớ/Ờ/Ở/á» /Ợ/Ú/Ù/Ủ/Ũ/Ụ/Ư/Ứ/Ừ/Ử/á»®/á»°/Ã/Ỳ/Ỷ/Ỹ/á»´/Ä/" WinCP1258: z(15) = "á/à/aÒ/aÞ/aò/ã/ãì/ãÌ/ãÒ/ãÞ/ãò/â/âì/âÌ/âÒ/âÞ/âò/é/è/eÒ/eÞ/eò/ê/êì/êÌ/êÒ/êÞ/êò/í/iÌ/iÒ/iÞ/iò/ó/oÌ/oÒ/oÞ/oò/ô/ôì/ôÌ/ôÒ/ôÞ/ôò/õ/õì/õÌ/õÒ/õÞ/õò/ú/ù/uÒ/uÞ/uò/ý/ýì/ýÌ/ýÒ/ýÞ/ýò/yì/yÌ/yÒ/yÞ/yò/ð/Á/À/AÒ/AÞ/Aò/Ã/Ãì/ÃÌ/ÃÒ/ÃÞ/Ãò/Â/Âì/ÂÌ/ÂÒ/ÂÞ/Âò/É/È/EÒ/EÞ/Eò/Ê/Êì/ÊÌ/ÊÒ/ÊÞ/Êò/Í/IÌ/IÒ/IÞ/Iò/Ó/OÌ/OÒ/OÞ/Oò/Ô/Ôì/ÔÌ/ÔÒ/ÔÞ/Ôò/Õ/Õì/ÕÌ/ÕÒ/ÕÞ/Õò/Ú/Ù/UÒ/UÞ/Uò/Ý/Ýì/ÝÌ/ÝÒ/ÝÞ/Ýò/Yì/YÌ/YÒ/YÞ/Yò/Ð" VNICodes = z Erase z End Function
Code chuyển đổi sang Unicode: code của anh Ngọc.
Mã:Public Enum ConvertType TCVN2Unicode = 0 VNIWIN2Unicode = 1 Unicode2TCVN = 2 Unicode2VNIWin = 3 VNI2TCVN = 4 TCVN2VNI = 5 UniCp2Uni = 6 Uni2UniCp = 7 End Enum Private IsInitialised As Boolean ' bien nay dung de khong can phai tai lai cac chuoi so sanh nua Dim iUnicode As Variant ' array to keep unicode char set Dim iTCVN As Variant ' array to keep TCVN char set Dim iVNI As Variant ' array to keep TCVN char set Dim iUniCp As Variant Function VowelsToArray(CharVowels As String, Optional MuliChartype As Boolean = True) As Variant ' Put the multichar Vowels to an array On Error GoTo errmsg Dim i As Integer, j As Integer, mText As String ' Dim mTmpArr As Variant ' Send the text into an Array of 134 items mText = CharVowels If MuliChartype = True Then ' this is a multchar list mTmpArr = Split(CharVowels, "/") Else ' this is a single char mTmpArr = Array(133) For i = 1 To Len(mText) ' now extracting the list mTmpArr(i - 1) = Mid(mText, i, 1) & CStr(i) Next End If VowelsToArray = mTmpArr Exit Function errmsg: MsgBox Err.Description & " " & j & Len(mText) & "//" & mText & "//" End Function Function GetUnicodeString() As String ' This function is no longer kept but I still would like it to be here for some folks if they want to diggest Dim iUnicode As Variant ' array to keep unicode char set Dim i As Long, iStr As String iUnicode = Array(225, 224, 7843, 227, 7841, 259, 7855, 7857, 7859, 7861, 7863, 226, 7845, 7847, 7849, _ 7851, 7853, 233, 232, 7867, 7869, 7865, 234, 7871, 7873, 7875, 7877, 7879, 237, 236, 7881, 297, 7883, _ 243, 242, 7887, 245, 7885, 244, 7889, 7891, 7893, 7895, 7897, 417, 7899, 7901, 7903, 7905, 7907, 250, _ 249, 7911, 361, 7909, 432, 7913, 7915, 7917, 7919, 7921, 253, 7923, 7927, 7929, 7925, 273, 193, 192, _ 7842, 195, 7840, 258, 7854, 7856, 7858, 7860, 7862, 194, 7844, 7846, 7848, 7850, 7852, 201, 200, 7866, _ 7868, 7864, 202, 7870, 7872, 7874, 7876, 7878, 205, 204, 7880, 296, 7882, 211, 210, 7886, 213, 7884, _ 212, 7888, 7890, 7892, 7894, 7896, 416, 7898, 7900, 7902, 7904, 7906, 218, 217, 7910, 360, 7908, 431, _ 7912, 7914, 7916, 7918, 7920, 221, 7922, 7926, 7928, 7924, 272) For i = 0 To UBound(iUnicode) iStr = iStr & "/" & ChrW(iUnicode(i)) Next GetUnicodeString = Mid(iStr, 2) End Function Private Function Code2Char(txt As String) As Variant ' for converting code to char Dim Arr1 As Variant, Arr2 As Variant, Arr3(133) As String Dim i As Long, j As Long, Str As String Arr1 = Split(txt, "/") For i = 0 To UBound(Arr1) Str = "" Arr2 = Split(Arr1(i), ",") For j = 0 To UBound(Arr2) Str = Str & ChrW(Arr2(j)) Next Arr3(i) = Str Next Code2Char = Arr3 End Function Function ConvertText(txtString As String, Optional CodePage As ConvertType = 0) As String ' ham nay cho phep chuyen lan nhau tu Unicode sang VNI Windows, TCVN va nguoc lai - 6 cach chuyen If txtString = "" Then ConvertText = "''" Exit Function End If Dim iStr As String, ProcStr As String, RevList As String Dim i As Long, ElmNum As Long Dim ProcList As Variant, ProcVar As Variant, SeedVar As Variant Dim RevArr As Variant Dim MultiChar As Boolean iStr = txtString If Not IsInitialised Then IsInitialised = True iUnicode = VowelsToArray(GetUnicodeString()) iVNI = VowelsToArray("aù/aø/aû/aõ/aï/aê/aé/aè/aú/aü/aë/aâ/aá/aà/aå/aã/aä/eù/eø/eû/eõ/eï/eâ/eá/eà/eå/" & _ "eã/eä/í/ì/æ/ó/ò/où/oø/oû/oõ/oï/oâ/oá/oà/oå/oã/oä/ô/ôù/ôø/ôû/ôõ/ôï/uù/uø/uû/uõ/uï/ö/" & _ "öù/öø/öû/öõ/öï/yù/yø/yû/yõ/î/ñ/AÙ/AØ/AÛ/AÕ/AÏ/AÊ/AÉ/AÈ/AÚ/AÜ/AË/AÂ/AÁ/AÀ/AÅ/AÃ/AÄ/EÙ/EØ/" & _ "EÛ/EÕ/EÏ/EÂ/EÁ/EÀ/EÅ/EÃ/EÄ/Í/Ì/Æ/Ó/Ò/OÙ/OØ/OÛ/OÕ/OÏ/OÂ/OÁ/OÀ/OÅ/OÃ/OÄ/Ô/ÔÙ/ÔØ/ÔÛ/ÔÕ/ÔÏ/" & _ "UÙ/UØ/UÛ/UÕ/UÏ/Ö/ÖÙ/ÖØ/ÖÛ/ÖÕ/ÖÏ/YÙ/YØ/YÛ/YÕ/Î/Ñ") iTCVN = VowelsToArray("¸/µ/¶/·/¹/¨/¾/»/¼/½/Æ/©/Ê/Ç/È/É/Ë/Ð/Ì/Î/Ï/Ñ/ª/Õ/Ò/Ó/Ô/Ö/Ý/×/Ø/Ü/Þ/ã/ß/" & _ "á/â/ä/«/è/å/æ/ç/é/¬/í/ê/ë/ì/î/ó/ï/ñ/ò/ô//ø/õ/ö/÷/ù/ý/ú/û/ü/þ/®/¸/µ/¶/·/¹/¡/¾/»/¼/½/Æ/¢/Ê/" & _ "Ç/È/É/Ë/Ð/Ì/Î/Ï/Ñ/£/Õ/Ò/Ó/Ô/Ö/Ý/×/Ø/Ü/Þ/ã/ß/á/â/ä/¤/è/å/æ/ç/é/¥/í/ê/ë/ì/î/ó/ï/ñ/ò/ô/¦/ø/õ/ö" & _ "/÷/ù/ý/ú/û/ü/þ/§") iUniCp = Code2Char("97,769/97,768/97,777/97,771/97,803/259/259,769/259,768/259,777/259,771/259,803/" & _ "226/226,769/226,768/226,777/226,771/226,803/101,769/101,768/101,777/101,771/101,803/234/234,769/" & _ "234,768/234,777/234,771/234,803/105,769/105,768/105,777/105,771/105,803/111,769/111,768/111,777/" & _ "111,771/111,803/244/244,769/244,768/244,777/244,771/244,803/417/417,769/417,768/417,777/417,771/" & _ "417,803/117,769/117,768/117,777/117,771/117,803/432/432,769/432,768/432,777/432,771/432,803/121,769/" & _ "121,768/121,777/121,771/121,803/273/65,769/65,768/65,777/65,771/65,803/258/258,769/258,768/258,777/" & _ "258,771/258,803/194/194,769/194,768/194,777/194,771/194,803/69,769/69,768/69,777/69,771/69,803/202/" & _ "202,769/202,768/202,777/202,771/202,803/73,769/73,768/73,777/73,771/73,803/79,769/79,768/79,777/" & _ "79,771/79,803/212/212,769/212,768/212,777/212,771/212,803/416/416,769/416,768/416,777/416,771/" & _ "416,803/85,769/85,768/85,777/85,771/85,803/431/431,769/431,768/431,777/431,771/431,803/89,769/" & _ "89,768/89,777/89,771/89,803/272") End If ' Chon cach chuyen dua vao tham so Select Case CodePage Case 0: 'Tu TCVN sang Unicode SeedVar = iTCVN ProcVar = iUnicode Case 1: 'Tu VNI san Unicode SeedVar = iVNI ProcVar = iUnicode Case 2: 'Tu Unicode san TCVN SeedVar = iUnicode ProcVar = iTCVN Case 3: 'Tu Unicode sang VNI SeedVar = iUnicode ProcVar = iVNI Case 4: 'Tu VNI sang TCVN SeedVar = iVNI ProcVar = iTCVN Case 5: 'Tu TCVN sang VNI SeedVar = iTCVN ProcVar = iVNI Case 6: 'Tu Unicp sang Unicode ' forward conversion by default SeedVar = iUniCp ProcVar = iUnicode Case 7: 'Tu Unicode sang Unicp SeedVar = iUnicode ProcVar = iUniCp End Select MultiChar = IIf(Len(SeedVar(i)) > 1, True, False) ' Diem yeu cua cach nay la luon chay qua 133 lenh cua bang ma tieng viet ' Dau tien chuyen cac chuoi ma co 2 ky tu truoc de tranh viec chuyen lap 2 lan For i = 0 To UBound(SeedVar) If MultiChar And Len(SeedVar(i)) = 1 Then ' Ok day la chuoi 1 ky tu trong bang ma 2 byte, bo qua, va ghi lai so thu tu cua no RevList = RevList & "," & i Else If InStr(iStr, SeedVar(i)) > 0 Then 'Chi chuyen neu tim thay ky tu iStr = Replace(iStr, SeedVar(i), "[[" & i & "]]") ProcStr = ProcStr & ",[[" & i & "]]" End If End If Next ' Thuc hien chuyen sang chuoi trung gian voi phan con lai RevArr = Split(RevList, ",") For i = 0 To UBound(RevArr) ElmNum = Val(RevArr(i)) If InStr(iStr, SeedVar(ElmNum)) > 0 Then 'chi chuyen ma neu tim thay co doan chuoi tim duoc iStr = Replace(iStr, SeedVar(ElmNum), "[[" & ElmNum & "]]") ProcStr = ProcStr & ",[[" & ElmNum & "]]" End If Next ProcList = Split(ProcStr, ",") ' Gio chuyen nguoc lai bang ma chuan For i = 0 To UBound(ProcList) If ProcList(i) <> "" Then ElmNum = Val(Mid(ProcList(i), 3)) iStr = Replace(iStr, ProcList(i), ProcVar(ElmNum)) End If Next ' gio phai loai bo cac loi ky tu trong chuoi vi du dau "'" co the làm SQL bi loi ConvertText = iStr 'Replace(iStr, "'", "''") End Function
Không thấy chỗ nào giải thích giá trị mà detectVNICode trả về có ý nghĩa như thế nào. Tức ở hình dưới thì 4 có nghĩa là gì và 6 có nghĩa là gì.Bài này phải phối hợp nhiều code của các bác đã làm sẳn trên GPE này.
Cách tôi làm là:
- Duyệt từng dòng, chạy code để tìm ra nó dùng bảng mã gì.
- Sau khi tìm ra thì dùng hàm chuyển đổi từng loại bảng mã sang Unicode.
Nếu xử lý mấy ngàn dòng, thì không biết nó chạy bao lâu.
Code xác định bảng mã: dùng code của bạn Hesanbi (link)
Bạn nên dùng từ thật chính xác. Nhiều người cứ dùng từ font - phông chữ.cảm ơn bạn đã gửi thông tin, do file tổng hợp từ các bộ phận gửi ( vài ngàn dòng ) nên cần giải pháp tìm font ở mỗi dòng để tổng hợp về 1 font duy nhất nên nhờ GPE chỉ giùm cách xác định font ở từng dòng. Cám ơn.
Tôi nói rõ một chút về vấn đề cần GPE giúp, hiện tại trong File có nhiều kiểu gõ văn bản, trong đó đa số dùng VNI và Unicode, vì vậy tôi muốn nhờ anh em giúp tôi phân loại kiểu gõ của từng ô ( dòng ) để tôi tổng hợp lại thành 1 kiểu gõ duy nhất, còn người xem muốn chọn Font nào miễn sao họ đọc hoặc in ra được. Còn bước tiếp theo là chuyển tất cả về VNI hoặc Unicode để khi xem hoặc in chỉ chọn 1 font duy nhất cho cả File. Cám ơn.Bạn nên dùng từ thật chính xác. Nhiều người cứ dùng từ font - phông chữ.
Unicode, UTF-8, VNI, VN3 ... là những bảng MÃ được dùng để ghi một văn bản. Còn phông chữ là cái dùng để hiển thị văn bản. Tôi cho ví dụ. Bạn gõ vào ô A1 dùng Unikey và chọn bảng mã unicode. Nói nôm na thì trong A1 có văn bản unicode. Để hiển thị văn bản trong A1 bạn có thể chọn phông chữ cho A1 là phông chữ bất kỳ, nhưng để hiển thị thật chuẩn thì bạn phải chọn Arial, Times New Roman, Verdana, Calibri, và một số phông chữ khác có chứa đầy đủ các ký tự Việt Nam. Tức văn bản chỉ có 1 bất di bất dịch nhưng để hiển thị văn bản đó bạn có thể chọn nhiều phông chữ khác nhau. Arial, Times New Roman mới là PHÔNG CHỮ chứ không phải Unicode là PHÔNG CHỮ.
Đúng là trường hợp này cũng ít khi gặp đó bạn. Trường hợp như chủ thớt đề cập, và tôi thì gặp trường hợp có người cần chuyển CSDL từ ứng dụng cũ sang ứng dụng mới. Thường ứng dụng cũ hay dùng bảng mã TCVN3 đo đó khi chuyển qua ứng dụng mới chuyển hết sang Unicode cho nó đồng bộ. Khi đó phải duyệt từng table và đổi. Cái thuận tiện là ở chỗ họ chỉ dùng 1 kiểu bảng mã.Vấn đề này thú vị nhưng quá hiếm khi gặp. Hóng chủ thớt chạy thử có ổn không.
Anh hiểu đúng rồi đó.Không thấy chỗ nào giải thích giá trị mà detectVNICode trả về có ý nghĩa như thế nào. Tức ở hình dưới thì 4 có nghĩa là gì và 6 có nghĩa là gì.
Thôi thì cứ hiểu thế này: cùng 1 kết quả mà detectVNICode trả về thì nghĩa là các text cùng KIỂU.
Nhưng nhìn D19 = 6 = D13 thì khó chấp nhận là A19 và A13 cùng kiểu. Nhìn bằng mắt thì có vẻ A19 là unicode còn A13 khó có thể là unicode.
Bạn gửi file này lên mình làm cho nhé.file vài ngàn dòng nhưng gửi mẫu ít dòng
Bạn xem giúp mình nha ( do File này tổng hợp từ các bộ phận, mỗi dòng là công việc thực tế của 1 người nên họ làm không theo yêu cầu mình đã nhắc nhưng vẫn không được như đề nghị ) & hỗ trợ mình dùng lâu dài ( làm tổng hợp mỗi tháng ), đôi khi còn nhiều hơn số này. Cám ơn.Bạn gửi file này lên mình làm cho nhé.
Bạn không cần nói rõ hơn đâu vì tôi hiểu bạn muốn gì mà. Tôi chỉ góp ý là bạn nên dùng từ chính xácTôi nói rõ một chút về vấn đề cần GPE giúp,
Nói VNI, unicode, VN3 là font là không đúng.Bạn nên dùng từ thật chính xác.
Cái lạ hơn là từ dòng 9-19 tôi nhận toàn 6 trong khi bạn nhận được 4 từ 9-13 và 2 từ 14-19.Anh hiểu đúng rồi đó.
Giá trị trả về theo từng bảng mã:
Em đưa hàm đó vô thì chạy ra như vầy: Test thử thấy có mấy trường hợp nó nhận dạng sai, không biết lỗi nằm chỗ nào. Chắc số lượng các ký tự chưa đủ để xác định.
Kiểm tra thì thấy code nhận dạng sai bảng mã VNI, nó trả về là TCVN3. Nếu dùng phầm mềm chuyển mã khác thì nó nhận dạng đúng hơn (mặc dù chính xác 70%)
Có tổng cộng 6509 VNI, 38 VN3, 324 unicode.Bạn xem giúp mình nha ( do File này tổng hợp từ các bộ phận, mỗi dòng là công việc thực tế của 1 người nên họ làm không theo yêu cầu mình đã nhắc nhưng vẫn không được như đề nghị ) & hỗ trợ mình dùng lâu dài ( làm tổng hợp mỗi tháng ), đôi khi còn nhiều hơn số này. Cám ơn.
cám ơn bạn đã giúp, bạn có thể hướng dẫn thêm cách làm để tôi có thể áp dụng cho các trường hợp tương tự.Có tổng cộng 6509 VNI, 38 VN3, 324 unicode.
Bạn hãy bắt đầu đối thoại (không phải nhắn tin mà là conversation) với tôi. Khoảng 24:00 giờ VN tôi sẽ gửi code cho riêng bạn.cám ơn bạn đã giúp, bạn có thể hướng dẫn thêm cách làm để tôi có thể áp dụng cho các trường hợp tương tự.
tôi chưa hiểu chổ này, mong bạn tchia sẻ thêm thông tin. cám ơn.Bạn hãy bắt đầu đối thoại (không phải nhắn tin mà là conversation) với tôi.
Bấm vào nick của bác sỹ rồi bấm bắt đầu đối thoạitôi chưa hiểu chổ này, mong bạn tchia sẻ thêm thông tin. cám ơn.
Chỗ bấm đây này :View attachment 274262
tôi bấm vào nick của batman1 thì nhận thông báo này
Thôi bạn không phải bắt đầu gì cả vì tôi đã tự bắt đầu thay bạn rồi.tôi chưa hiểu chổ này, mong bạn tchia sẻ thêm thông tin. cám ơn.