convert text windows code page 1258 sang Unicode

Liên hệ QC

luanon

Thành viên mới
Tham gia
3/7/10
Bài viết
26
Được thích
3
Chào các anh,
Mình có 1 vấn đề với dữ liệu trích xuất từ Oracle, khi trích xuất ra thì dữ liệu là Window codepage 1258, mình đang tìm cách convert sang Unicode, nhưng không được,
Mong các anh giúp đỡ,

File đính kèm đã có các hàm Window1258toUnicode() của các cao thủ trên diễn đàn, nhưng mình thâý vẫn không chạy đúng, nhờ các a cao thủ giúp giùm,

Cảm ơn
 
Lần chỉnh sửa cuối:
chào các anh,
mình có 1 vấn đề với dữ liệu trích xuất từ oracle, khi trích xuất ra thì dữ liệu là window codepage 1258, mình đang tìm cách convert sang unicode, nhưng không được,
mong các anh giúp đỡ,

file đính kèm đã có các hàm window1258tounicode() của các cao thủ trên diễn đàn, nhưng mình thâý vẫn không chạy đúng, nhờ các a cao thủ giúp giùm,

cảm ơn
tôi kiểm tra kết quả không thấy chỗ nào sai cả. Bạn thử nêu chỗ sai xem nào ?
 

File đính kèm

  • CHECK.JPG
    CHECK.JPG
    160.4 KB · Đọc: 109
error.jpg
anh cứ Control F, sau đó tìm kiếm xem, ví dụ, Trịnh Thị Diễn có trong danh sách, nhưng khi tìm ta không thấy, vì data trong sheet vẫn là Window 1258, khi ta gõ vào box Find là unicode, nên 2 text này ko match với nhau, nên kết quả sẽ không tìm thấy !
 
Chào các anh,
Mình có 1 vấn đề với dữ liệu trích xuất từ Oracle, khi trích xuất ra thì dữ liệu là Window codepage 1258, mình đang tìm cách convert sang Unicode, nhưng không được,
Mong các anh giúp đỡ,

File đính kèm đã có các hàm Window1258toUnicode() của các cao thủ trên diễn đàn, nhưng mình thâý vẫn không chạy đúng, nhờ các a cao thủ giúp giùm,

Cảm ơn

Bạn có bộ gõ Unikey đấy chứ?

Bấm Ctrl+Shift+F6 để có bảng mã (như trong hình)

Chọn Nguồn là Windows CP 1258

Chọn Đích là Unicode. Sau đó bấm nút Đóng.

Bây giờ, bạn copy vùng cần convert, sau khi copy (chưa paste nhé), bấm tiếp Ctrl+Shift+F9, sau khi nghe tiếng beep là bạn chọn vùng cần paste rồi paste nhé!
 

File đính kèm

  • Toolkit.jpg
    Toolkit.jpg
    55.4 KB · Đọc: 81
hi a Nghĩa,
Mình định import vào Tool (hàm) để convert tự động !! Còn manual thì mình hiểu rồi !!!!
Unikey là chuẩn !!!
 
hi a Nghĩa,
Mình định import vào Tool (hàm) để convert tự động !! Còn manual thì mình hiểu rồi !!!!
Unikey là chuẩn !!!

Bạn muốn hàm thì tôi cũng gửi tặng bạn một hàm convert Font đó cho bạn:

Chép vào module nhé!

[GPECODE=vb]Option Explicit'**********************************************************************
Public Enum FontStyles
NoMarksStyle = 0
UnicodeStyle = 1
VCP1258Style = 2
End Enum
'**********************************************************************
Private AllCaseArray As Variant
'**********************************************************************


Function FontConverter(ByVal ChuoiCanChuyenMa As String, _
ByVal MaNguon As FontStyles, _
ByVal MaDich As FontStyles) As String
'Cách dùng: Không dâ'u = 0, Unicode = 1, Vietnamese1258 = 2

If MaNguon < NoMarksStyle Or MaNguon > VCP1258Style _
Or MaDich < NoMarksStyle Or MaDich > VCP1258Style _
Or Trim(ChuoiCanChuyenMa) = "" Then Exit Function

If MaNguon = MaDich Or MaNguon = NoMarksStyle Then _
FontConverter = ChuoiCanChuyenMa: Exit Function

Dim i As Long, j As Long, Ubd As Long, LenChar As Long, Ch2b As Boolean, _
TransChar As String, inString1 As String, inString2 As String

If Not IsArray(AllCaseArray) Then Call FontSourceForConvert

TransChar = ChuoiCanChuyenMa: LenChar = Len(TransChar)
Ubd = 133 '' UBound(AllCaseArray(MaNguon)) = 133

Select Case MaNguon
Case UnicodeStyle
For i = 1 To LenChar
inString1 = Mid(TransChar, i, 1)
If AscW(inString1) >= 192 Then
For j = 0 To Ubd
If inString1 = AllCaseArray(MaNguon)(j) Then
inString1 = AllCaseArray(MaDich)(j)
Exit For
End If
Next
End If
FontConverter = FontConverter + inString1
Next
Case VCP1258Style
For i = 1 To LenChar
Ch2b = False
If i < LenChar Then
inString2 = Mid(TransChar, i + 1, 1)
If inString2 Like "[ìÌÒÞò]" = True Then Ch2b = True
End If
inString1 = Mid(TransChar, i, IIf(Ch2b, 2, 1))
For j = 0 To Ubd
If inString1 = AllCaseArray(MaNguon)(j) Then
inString1 = AllCaseArray(MaDich)(j)
Exit For
End If
Next
FontConverter = FontConverter + inString1
If Ch2b Then
If LenChar = 2 Then
Exit Function
ElseIf LenChar > 2 Then
i = i + 1
End If
End If
Next
End Select
End Function


Private Sub FontSourceForConvert()
Dim NoMarksCase(), UnicodeCase(), VCP1258Case()
NoMarksCase = Array("a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "d", "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", "A", "A", _
"A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "D", "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")
UnicodeCase = Array(ChrW(225), ChrW(224), ChrW(7843), ChrW(227), ChrW(7841), ChrW(226), ChrW(7845), ChrW(7847), ChrW(7849), ChrW(7851), _
ChrW(7853), ChrW(259), ChrW(7855), ChrW(7857), ChrW(7859), ChrW(7861), ChrW(7863), ChrW(273), ChrW(233), _
ChrW(232), ChrW(7867), ChrW(7869), ChrW(7865), ChrW(234), ChrW(7871), ChrW(7873), ChrW(7875), ChrW(7877), ChrW(7879), _
ChrW(237), ChrW(236), ChrW(7881), ChrW(297), ChrW(7883), ChrW(243), ChrW(242), ChrW(7887), ChrW(245), _
ChrW(7885), ChrW(244), ChrW(7889), ChrW(7891), ChrW(7893), ChrW(7895), ChrW(7897), ChrW(417), ChrW(7899), ChrW(7901), _
ChrW(7903), ChrW(7905), ChrW(7907), ChrW(250), ChrW(249), ChrW(7911), ChrW(361), ChrW(7909), ChrW(432), _
ChrW(7913), ChrW(7915), ChrW(7917), ChrW(7919), ChrW(7921), ChrW(253), ChrW(7923), ChrW(7927), ChrW(7929), ChrW(7925), _
ChrW(193), ChrW(192), ChrW(7842), ChrW(195), ChrW(7840), ChrW(194), ChrW(7844), ChrW(7846), ChrW(7848), _
ChrW(7850), ChrW(7852), ChrW(258), ChrW(7854), ChrW(7856), ChrW(7858), ChrW(7860), ChrW(7862), ChrW(272), ChrW(201), _
ChrW(200), ChrW(7866), ChrW(7868), ChrW(7864), ChrW(202), ChrW(7870), ChrW(7872), ChrW(7874), ChrW(7876), _
ChrW(7878), ChrW(205), ChrW(204), ChrW(7880), ChrW(296), ChrW(7882), ChrW(211), ChrW(210), ChrW(7886), ChrW(213), _
ChrW(7884), ChrW(212), ChrW(7888), ChrW(7890), ChrW(7892), ChrW(7894), ChrW(7896), ChrW(416), ChrW(7898), ChrW(7900), _
ChrW(7902), ChrW(7904), ChrW(7906), ChrW(218), ChrW(217), ChrW(7910), ChrW(360), ChrW(7908), ChrW(431), ChrW(7912), _
ChrW(7914), ChrW(7916), ChrW(7918), ChrW(7920), ChrW(221), ChrW(7922), ChrW(7926), ChrW(7928), ChrW(7924))
VCP1258Case = Array("aì", "aÌ", "aÒ", "aÞ", "aò", "â", "âì", "âÌ", "âÒ", "âÞ", "âò", "ã", "ãì", "ãÌ", "ãÒ", "ãÞ", "ãò", "ð", "eì", _
"eÌ", "eÒ", "eÞ", "eò", "ê", "êì", "êÌ", "êÒ", "êÞ", "êò", "iì", "iÌ", "iÒ", "iÞ", "iò", "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ò", "Ê", "Êì", "ÊÌ", "ÊÒ", "ÊÞ", "Êò", _
"Iì", "IÌ", "IÒ", "IÞ", "Iò", "Oì", "OÌ", "OÒ", "OÞ", "Oò", "Ô", "Ôì", "ÔÌ", "ÔÒ", "ÔÞ", "Ôò", "Õ", "Õì", "ÕÌ", _
"ÕÒ", "ÕÞ", "Õò", "Uì", "UÌ", "UÒ", "UÞ", "Uò", "Ý", "Ýì", "ÝÌ", "ÝÒ", "ÝÞ", "Ýò", "Yì", "YÌ", "YÒ", "YÞ", "Yò")
'MsgBox UBound(NoMarksCase) & "/" & UBound(UnicodeCase) & "/" & UBound(VCP1258Case) ''133/133/133
AllCaseArray = Array(NoMarksCase, UnicodeCase, VCP1258Case)
End Sub
[/GPECODE]
 
sao hàm này vẫn không sài được vậy a Nghĩa, nhờ a xem giúp nhé !
 
Thank a Nghĩa,
Mình đã gửi lên file,
Tuần tự mình check như sau:
1. dùng hàm fontcoverter --> để chuyển từ Windows1258 sang Unicode
2. thử check lại bằng cách
- Mở unikey
- chọn Unicode dựng sẵn
- quay trở lại file ẽxcel, Ctrl+F để tìm kiếm --> nhập vào chuỗi Unicode, tìm đúng chuỗi mà trong file đang có ===> không tìm thấy

==> mình "gà" coding nên không biết check, mình dùng Unikey xem, chuỗi 1258 này đã được convêrt qua Unicode chưa, nếu đã convert qua Unicode, thì khi seảrch Unicode thì sẽ tìm thấy !!!
 

File đính kèm

  • GPE_help_lan3.xlsm
    27.9 KB · Đọc: 39
Thank a Nghĩa,
Mình đã gửi lên file,
Tuần tự mình check như sau:
1. dùng hàm fontcoverter --> để chuyển từ Windows1258 sang Unicode
2. thử check lại bằng cách
- Mở unikey
- chọn Unicode dựng sẵn
- quay trở lại file ẽxcel, Ctrl+F để tìm kiếm --> nhập vào chuỗi Unicode, tìm đúng chuỗi mà trong file đang có ===> không tìm thấy

==> mình "gà" coding nên không biết check, mình dùng Unikey xem, chuỗi 1258 này đã được convêrt qua Unicode chưa, nếu đã convert qua Unicode, thì khi seảrch Unicode thì sẽ tìm thấy !!!


Không biết máy bạn thế nào, nhưng máy tôi hiển thị không bị lỗi nào trong dữ liệu bạn đưa lên.
 
Hiển thị thì okie, vì đều thể hiện chữ tiếng Việt tốt, nhưng bản chất là 2 codepage khác nhau Windows 1258 <--> Unicode, nên khi tìm kiếm sẽ không thấy, mặc dù dữ liệu có !!!

PS: cái này ko rành nên ko dám nói, tuy nhiên cũng nhờ người rành như a check giúp, hình như nó bê nguyên xi Windows 1258 chứ ko convert sang Unicode--> có thể nó ko "map" được với array VCP1258Case = Array(.......)
Còn convert từ VNI sang Uni thì rất tốt !

 
View attachment 106026
anh cứ Control F, sau đó tìm kiếm xem, ví dụ, Trịnh Thị Diễn có trong danh sách, nhưng khi tìm ta không thấy, vì data trong sheet vẫn là Window 1258, khi ta gõ vào box Find là unicode, nên 2 text này ko match với nhau, nên kết quả sẽ không tìm thấy !

Không, text đã là unicode chứ không phải Windows 1258.

Không tìm thấy bởi vì văn bản được hàm dịch ra chứa ký tự Việt unicode TỔ HỢP

Bạn tải tập tin đính kèm về rồi giải nén. Bạn thêm vào tập tin của mình module của tôi. Thử xem có được không.

Tôi có thuốc nhưng không có bệnh nhân để test thuốc. Gặp được bạn mừng quá.

Cú pháp:

SourceToDest(ByVal text As String, source As convert_source, dest As convert_dest)

text: văn bản cần convert
source: nhập mã của văn bản nguồn
dest: nhập mã văn bản đích

mã: 1 - unicode (dựng sắn), 2 - vni, 3 - vn3, 4 - windows1258, 5 - không dấu

Tức trong trường hợp của bạn convert từ windows1258 (nguồn) tới unicode (đích thì:

=SourceToDest(text, 4, 1)


Nếu convert từ unicode (có thể là unicode dựng sẵn mà cũng có thể là unicode tổ hợp hoặc lẫn lộn) sang unicode (luôn dựng sẵn) thì

=SourceToDest(text, 1, 1)
---------------
Chú ý: Bạn phải dùng SourceToDest(text, 4, 1) cho văn bản nguồn là cái chưa convert bao giờ, tức xuất từ Oracle. Nếu bạn muốn convert từ tập tin đính kèm là văn bản đã qua convert sang unicode nhưng chứa ký tự unicode tổ hợp thì bạn phải dùng SourceToDest(text, 1, 1) - convert từ unicode sang unicode

Tóm lại:
1. convert dữ liệu trích xuất từ Oracle thì SourceToDest(text, 4, 1)
2. convert văn bản trong tập tin bạn đính kèm (đã là unicode tổ hợp) thì SourceToDest(text, 1, 1)
 

File đính kèm

  • vietnamese_unicode_convert.rar
    3.6 KB · Đọc: 128
Lần chỉnh sửa cuối:
cũng vẫn không được a siwtom ah !!! :-(
 
anh có online ko tôi mở teamview cho anh xem luôn :)
 
Lần chỉnh sửa cuối:
mình đã dùng =SourceToDest(A2,4,1) theo đúng cú pháp của hàm bạn cho mình !
 
cũng vẫn không được a siwtom ah !!! :-(

Bạn xem dòng đỏ đỏ trong bài viết trước.
Bạn không convert từ nguồn từ Oracle mà convert cái có trong tập tin là cái đã convert sang unicode (nhưng là unicode tổ hợp) thì bạn phải dùng SourceToDest(text, 1, 1)


Bởi hiện bạn đã có unicode (nhưng tổ hợp) trong tập tin Excel nên để convert sang unicode (chắc chắn là dựng sẵn) thì phải dùng cả 2 mã là 1
=SourceToDest(text, 1, 1)
 
Lần chỉnh sửa cuối:
oh, mình dùng =SourceToDest(A2,4,1) thì được. Có nghĩa là data xuất ra đã là Unicode tổ hợp rồi ---> chứ không phải Windows 1258.
Thanks bạn Siwtom rất nhiều, hàm của bạn tốt quá, mình xin được chia sẻ nhé ! Cảm ơn nhiều, chúc cuối tuần vui vẻ !
 
Thầy nào hội mình chuyển từ listview hoặc treeview về excel với
 

File đính kèm

  • bao tri 1.10.22.xlsm
    5.3 MB · Đọc: 8
Web KT

Bài viết mới nhất

Back
Top Bottom