• 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

Chuyển chữ Tiếng Việt có dấu thành không dấu

Các mẹo vặt linh tinh không thuộc các nhóm trên

Moderators: tungcan5diop, QUANITGROBEST

User avatar
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Posts: 1123
Joined: Wed 24/09/2008 4:04 pm
Location: TPHCM
Has thanked: 1 time
Been thanked: 28 times

Chuyển chữ Tiếng Việt có dấu thành không dấu

Postby tungcan5diop » Sat 17/10/2009 1:25 pm

Thủ thuật: Chuyển chữ Tiếng Việt có dấu thành không dấu
Tác giả: tungcan5diop
Mô tả: Chuyển chữ Tiếng Việt có dấu thành không dấu


đang làm cái máy in POS nên viết hàm này.các bạn xem thử

Code: Select all

  1. ''' <summary>
  2.     ''' Hàm chuyển chữ Tiếng Việt có dấu sang không dấu
  3.     ''' </summary>
  4.     ''' <param name="mystr"> nhập chuỗi cần chuyển</param>
  5.     ''' <returns></returns>
  6.     ''' <remarks></remarks>
  7.     Function chuyensangkhongdau(ByVal mystr As String) As String
  8.         Dim myChar() As String = {"aàáảãạăằắẳẵặâầấẩẫậ", "AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬ", "ÒÒÓỎÕỌÔỒỐỔỖỘƠỜỚỞỠỢ", "EÈÉẺẼẸÊỀẾỂỄỆ", "UÙÚỦŨỤƯỪỨỬỮỰ", "IÌÍỈĨỊ", "YỲÝỶỸỴ", "Đ", "oòóỏõọôồốổỗộơờớởỡợ", "eèéẻẽẹêềếểễệ", "uùúủũụưừứửữự", "iìíỉĩị", "yỳýỷỹỵ", "đ"}
  9.         Dim myChar1() As String = {"a", "A", "O", "E", "U", "I", "Y", "Đ", "o", "e", "u", "i", "y", "d"}
  10.         Dim str As String = mystr
  11.         Dim strReturn As String = ""
  12.         For i As Int32 = 0 To str.Length - 1
  13.             Dim iStr As String = str.Substring(i, 1)
  14.             Dim rStr As String = iStr
  15.  
  16.             For j As Int32 = 0 To myChar.Length - 1
  17.                 If myChar(j).IndexOf(iStr) >= 0 Then
  18.                     rStr = myChar1(j)
  19.                     Exit For
  20.                 End If
  21.             Next
  22.             strReturn += rStr
  23.         Next
  24.         Return strReturn
  25.     End Function


Hỡi thế gian bug(lỗi) là gì?
Mà sửa...hoài không hết!

User avatar
hdn
Thành viên tâm huyết
Thành viên tâm huyết
Posts: 319
Joined: Wed 26/03/2008 7:09 pm
Has thanked: 1 time
Been thanked: 4 times

Re: Chuyển chữ Tiếng Việt có dấu thành không dấu

Postby hdn » Sat 17/10/2009 10:13 pm

từ ko dấu thành có dấu mới sợ >:)
:|

Superman
Mạnh Thường Quân
Mạnh Thường Quân
Posts: 233
Joined: Thu 11/06/2009 8:27 am
Location: nơi sẽ đến...
Has thanked: 1 time
Been thanked: 4 times
Contact:

Re: Chuyển chữ Tiếng Việt có dấu thành không dấu

Postby Superman » Sun 18/10/2009 12:54 am

lụm ở đâu hok nhớ...

Code: Select all

  1.        public static string RemoveUnicode(string s)
  2.         {
  3.             string stFormD = s.Normalize(NormalizationForm.FormD);
  4.             StringBuilder sb = new StringBuilder();
  5.  
  6.             for (int ich = 0; ich < stFormD.Length; ich++)
  7.             {
  8.                 UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
  9.                 if (uc != UnicodeCategory.NonSpacingMark)
  10.                 {
  11.                     sb.Append(stFormD[ich]);
  12.                 }
  13.             }
  14.             return (sb.ToString().Normalize(NormalizationForm.FormC));
  15.         }
My love wouldn't change...

User avatar
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Posts: 1123
Joined: Wed 24/09/2008 4:04 pm
Location: TPHCM
Has thanked: 1 time
Been thanked: 28 times

Re: Chuyển chữ Tiếng Việt có dấu thành không dấu

Postby tungcan5diop » Mon 19/10/2009 10:48 am

chuyển code của Superman qua VB.net.

Code: Select all

  1.  Function RemoveUnicode(ByVal s As String)
  2.         Dim stFormD As String = s.Normalize(System.Text.NormalizationForm.FormD)
  3.         Dim sb As New System.Text.StringBuilder
  4.         For ich As Integer = 0 To stFormD.Length - 1
  5.             Dim uc As UnicodeCategory = CharUnicodeInfo.GetUnicodeCategory(stFormD(ich))
  6.             If uc = UnicodeCategory.NonSpacingMark = False Then
  7.                 sb.Append(stFormD(ich))
  8.             End If
  9.         Next
  10.         Return sb.ToString().Normalize(System.Text.NormalizationForm.FormD)
  11.     End Function

nhớ thêm các namespace sau

Code: Select all

  1. Imports System
  2. Imports System.Windows.Forms
  3. Imports System.Globalization
  4. Imports System.Text
  5. Imports System.Reflection
  6. Imports Microsoft.VisualBasic

Cách của Superman chỉ áp dụng cho với Unicode,đối với font khác ko hỗ trợ...
Hỡi thế gian bug(lỗi) là gì?
Mà sửa...hoài không hết!

thuyan1990
Thành viên trung thành
Thành viên trung thành
Posts: 299
Joined: Sat 02/01/2010 10:23 am
Has thanked: 20 times
Been thanked: 2 times

Re: Chuyển chữ Tiếng Việt có dấu thành không dấu

Postby thuyan1990 » Mon 29/11/2010 10:40 am

Cảm ơn các bạn!
Nhưng 2 hàm trên chưa remove hẳn Unicode
ví dụ hàm 1 không loại bỏ được khi chuỗi có chữ Đ
hàm 2 thì không loại bỏ đc đ và Đ
chuỗi đã test " Niềm Ðau Giã Từ
Last edited by thuyan1990 on Mon 29/11/2010 11:15 am, edited 1 time in total.

User avatar
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Posts: 1123
Joined: Wed 24/09/2008 4:04 pm
Location: TPHCM
Has thanked: 1 time
Been thanked: 28 times

Re: Chuyển chữ Tiếng Việt có dấu thành không dấu

Postby tungcan5diop » Mon 29/11/2010 10:46 am

sửa cái này
  1. Dim myChar1() As String = {"a", "A", "O", "E", "U", "I", "Y", "Đ", "o", "e", "u", "i", "y", "d"}

thành
[vbnet]Dim myChar1() As String = {"a", "A", "O", "E", "U", "I", "Y", "D", "o", "e", "u", "i", "y", "d"}[/vbnet]
Hỡi thế gian bug(lỗi) là gì?
Mà sửa...hoài không hết!

thuyan1990
Thành viên trung thành
Thành viên trung thành
Posts: 299
Joined: Sat 02/01/2010 10:23 am
Has thanked: 20 times
Been thanked: 2 times

Re: Chuyển chữ Tiếng Việt có dấu thành không dấu

Postby thuyan1990 » Tue 30/11/2010 12:25 am

àh cái này trước khi em test chuỗi đó xong thì em có làm rồi (nhưng vẫn bị) anh test cái này thừ đi "Niềm Ðau Giã Từ"
Cảm ơn anh đã trả lời!

User avatar
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Posts: 1123
Joined: Wed 24/09/2008 4:04 pm
Location: TPHCM
Has thanked: 1 time
Been thanked: 28 times

Re: Chuyển chữ Tiếng Việt có dấu thành không dấu

Postby tungcan5diop » Thu 02/12/2010 10:44 am

Không biết sao cái hàm IndexOf kì cục qúa
vd:

vậy mà
[vbnet]str.IndexOf("Đ")=-1[/vbnet]
bạn có cách nào khác hay hơn không,cho mọi người tham khảo thử. :D
Hỡi thế gian bug(lỗi) là gì?
Mà sửa...hoài không hết!

User avatar
NoBi
Quản trị
Quản trị
Posts: 959
Joined: Tue 18/03/2008 1:22 pm
Location: Sài Gòn
Has thanked: 53 times
Been thanked: 66 times
Contact:

Re: Chuyển chữ Tiếng Việt có dấu thành không dấu

Postby NoBi » Thu 02/12/2010 4:04 pm

Anh thử cái này thấy nó trả ra 0 mà Tùng:
  1. Dim str As String
  2.         str = "Đ"
  3.         MsgBox(str.IndexOf("Đ"))
:>

User avatar
haitu
Guru
Guru
Posts: 206
Joined: Sat 10/09/2005 2:50 pm
Has thanked: 1 time
Been thanked: 19 times
Contact:

Re: Chuyển chữ Tiếng Việt có dấu thành không dấu

Postby haitu » Fri 03/12/2010 3:03 am

Vậy thử code này xem B-)

vì bản chất chữ Đ là ký tự đặt biệt nó có 2 mã là 208 và 272 chẳng rõ nguyên nhân tại sao :-/
Nếu trường hợp nó là mã 208 < 255 nên windows vẫn hiểu Đ là ký tự ANSII và hàm Instr hoặc indexof nó không so sánh được ký tự này -> kết quả luôn trả về = 0 đối với hàm Instr hoặc -1 đối với IndexOf (ký tự ANSII).
Nếu trường hợp nó là 272 thì hàm Instr hoặc IndexOf vẫn so sánh bình thường
->>>>>>>>>> do đó phải so sánh mã của chữ Đ thì mới đúng

  1. 'khai báo hằng số
  2.     Private Const sUnicode As String = "0224 0225 7843 0227 7841 0259 7857 7855 7859 7861 7863 0226 7847 7845 7849 7851 7853 0192 0193 7842 0195 7840 0258 7856 7854 7858 7860 7862 0194 7846 7844 7848 7850 7852 0242 0243 7887 0245 7885 0244 7891 7889 7893 7895 7897 0417 7901 7899 7903 7905 7907 0210 0210 0211 7886 0213 7884 0212 7890 7888 7892 7894 7896 0416 7900 7898 7902 7904 7906 0232 0233 7867 7869 7865 0234 7873 7871 7875 7877 7879 0200 0201 7866 7868 7864 0202 7872 7870 7874 7876 7878 0249 0250 7911 0361 7909 0432 7915 7913 7917 7919 7921 0217 0218 7910 0360 7908 0431 7914 7912 7916 7918 7920 0236 0237 7881 0297 7883 0204 0205 7880 0296 7882 7923 0253 7927 7929 7925 7922 0221 7926 7928 7924 0273 0272"
  3.     Private Const sAnsii As String = "0097 0097 0097 0097 0097 0097 0097 0097 0097 0097 0097 0097 0097 0097 0097 0097 0097 0065 0065 0065 0065 0065 0065 0065 0065 0065 0065 0065 0065 0065 0065 0065 0065 0065 0111 0111 0111 0111 0111 0111 0111 0111 0111 0111 0111 0111 0111 0111 0111 0111 0111 0079 0079 0079 0079 0079 0079 0079 0079 0079 0079 0079 0079 0079 0079 0079 0079 0079 0079 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0101 0069 0069 0069 0069 0069 0069 0069 0069 0069 0069 0069 0117 0117 0117 0117 0117 0117 0117 0117 0117 0117 0117 0085 0085 0085 0085 0085 0085 0085 0085 0085 0085 0085 0105 0105 0105 0105 0105 0073 0073 0073 0073 0073 0121 0121 0121 0121 0121 0089 0089 0089 0089 0089 0100 0068"
  4.  
  5. Private Function BoDauTV(ByVal str As String) As String
  6.         Dim iStt As Integer = 0, iVitri As Integer = -1
  7.         Dim sTmp As String = "", sKetqua As String = ""
  8.  
  9.         While iStt < str.Length
  10.             sTmp = str.Substring(iStt, 1)
  11.             iVitri = sUnicode.IndexOf(Format(AscW(sTmp), "0000").ToString)
  12.             If iVitri >= 0 Then
  13.                 sKetqua &= ChrW(sAnsii.Substring(iVitri, 4))
  14.             Else
  15.                 If AscW(sTmp) = 272 Or AscW(sTmp) = 208 Then sTmp = ChrW(68)
  16.                 sKetqua &= sTmp
  17.             End If
  18.             iStt += 1
  19.         End While
  20.         Return sKetqua
  21.     End Function


đang tính đi ngủ vô thấy vấn đề này hứng quá ngồi code luôn :(

thuyan1990
Thành viên trung thành
Thành viên trung thành
Posts: 299
Joined: Sat 02/01/2010 10:23 am
Has thanked: 20 times
Been thanked: 2 times

Re: Chuyển chữ Tiếng Việt có dấu thành không dấu

Postby thuyan1990 » Fri 03/12/2010 3:58 pm

tungcan5diop wrote:Không biết sao cái hàm IndexOf kì cục qúa
vd:

vậy mà
[vbnet]str.IndexOf("Đ")=-1[/vbnet]
bạn có cách nào khác hay hơn không,cho mọi người tham khảo thử. :D


Cách khắc phục chuyện này thì cũng đơn giản chỉ cần check cái ascii của chữa "Đ" vậy là ok liền. :D

User avatar
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Posts: 1123
Joined: Wed 24/09/2008 4:04 pm
Location: TPHCM
Has thanked: 1 time
Been thanked: 28 times

Re: Chuyển chữ Tiếng Việt có dấu thành không dấu

Postby tungcan5diop » Fri 03/12/2010 6:50 pm


Cách khắc phục chuyện này thì cũng đơn giản chỉ cần check cái ascii của chữa "Đ" vậy là ok liền.

hix.nếu biết vậy sao ko nói sớm,để anh HaiTu mò cả đêm qua :D ,cụ thể là code sao đi bạn. :)
Hỡi thế gian bug(lỗi) là gì?
Mà sửa...hoài không hết!

User avatar
lungocqua
Guru
Guru
Posts: 1225
Joined: Tue 18/08/2009 11:51 am
Location: Phú Hữu - Nhơn Trạch - Đồng Nai
Been thanked: 5 times
Contact:

Re: Chuyển chữ Tiếng Việt có dấu thành không dấu

Postby lungocqua » Mon 06/12/2010 12:41 pm

Dùng thử cái này xem. Cái này mình lấy trên mạng cũng lâu lắm rồi. Viết trên VB7.1 chuyển qua mấy bản cao hơn cũng chạy được. Nếu không chạy được thì sửa! :D
Ta đã trở lại và quên hết tất cả! :D

zicusa
Posts: 4
Joined: Thu 07/08/2008 7:58 am
Been thanked: 1 time

Re: Chuyển chữ Tiếng Việt có dấu thành không dấu

Postby zicusa » Fri 10/12/2010 11:03 am

Chỉ cần sửa lại đoạn code mà bác tungcan5diop đã chuyển một tý là sẽ giải quyết được vấn đề một cách đơn giản thôi.
  1. Function RemoveUnicode(ByVal s As String)
  2.         Dim stFormD As String = s.Normalize(System.Text.NormalizationForm.FormD)
  3.         Dim sb As New System.Text.StringBuilder
  4.         Dim str As String = "" ' Khai báo thêm cái này
  5.         For ich As Integer = 0 To stFormD.Length - 1
  6.             Dim uc As UnicodeCategory = CharUnicodeInfo.GetUnicodeCategory(stFormD(ich))
  7.             If uc = UnicodeCategory.NonSpacingMark = False Then
  8.                 'Sửa lại đoạn này 1 tý
  9.                 If stFormD(ich) = "đ" Then
  10.                     str = "d"
  11.                 ElseIf stFormD(ich) = "Đ" Then
  12.                     str = "D"
  13.                 Else
  14.                     str = stFormD(ich)
  15.                 End If
  16.                 sb.Append(str)
  17.             End If
  18.         Next
  19.         Return (sb.ToString().Normalize(System.Text.NormalizationForm.FormD))
  20.     End Function
  21.  

hieuvn
Posts: 4
Joined: Sun 28/12/2014 11:46 am
Been thanked: 1 time

Re: Chuyển chữ Tiếng Việt có dấu thành không dấu

Postby hieuvn » Mon 09/11/2015 2:56 pm

cao nhân nào viết code cho binding filter lấy từ textbox là Unicode luôn cho trọn bộ!
ví dụ binding source có cột [hoten] và textbox có tên là txtTen, mình (newbie) thử như sau:
binding.filter=string.format([hoten],{0}=RemoveUnicode(txtTen.text)) nhưng không được, bạn nào biết sửa hộ cái. Cảm ơn


Return to “[.NET] Mẹo vặt khác”

Who is online

Users browsing this forum: No registered users and 0 guests