• 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

Điều hành viên: tungcan5diop, QUANITGROBEST

Hình đại diện của người dùng
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Bài viết: 1123
Ngày tham gia: T.Tư 24/09/2008 4:04 pm
Đến từ: TPHCM
Has thanked: 1 time
Been thanked: 28 time

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

Gửi bàigửi bởi tungcan5diop » T.Bảy 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ử

Mã: Chọn hết

  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!

Hình đại diện của người dùng
hdn
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 319
Ngày tham gia: T.Tư 26/03/2008 7:09 pm
Has thanked: 1 time
Been thanked: 4 time

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

Gửi bàigửi bởi hdn » T.Bảy 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
Bài viết: 232
Ngày tham gia: T.Năm 11/06/2009 8:27 am
Đến từ: nơi sẽ đến...
Has thanked: 1 time
Been thanked: 4 time
Liên hệ:

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

Gửi bàigửi bởi Superman » CN 18/10/2009 12:54 am

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

Mã: Chọn hết

  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...

Hình đại diện của người dùng
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Bài viết: 1123
Ngày tham gia: T.Tư 24/09/2008 4:04 pm
Đến từ: TPHCM
Has thanked: 1 time
Been thanked: 28 time

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

Gửi bàigửi bởi tungcan5diop » T.Hai 19/10/2009 10:48 am

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

Mã: Chọn hết

  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

Mã: Chọn hết

  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
Bài viết: 299
Ngày tham gia: T.Bảy 02/01/2010 10:23 am
Has thanked: 20 time
Been thanked: 2 time

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

Gửi bàigửi bởi thuyan1990 » T.Hai 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ừ
Sửa lần cuối bởi thuyan1990 vào ngày T.Hai 29/11/2010 11:15 am với 1 lần sửa.

Hình đại diện của người dùng
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Bài viết: 1123
Ngày tham gia: T.Tư 24/09/2008 4:04 pm
Đến từ: TPHCM
Has thanked: 1 time
Been thanked: 28 time

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

Gửi bàigửi bởi tungcan5diop » T.Hai 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
  1. Dim myChar1() As String = {"a", "A", "O", "E", "U", "I", "Y", "D", "o", "e", "u", "i", "y", "d"}
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
Bài viết: 299
Ngày tham gia: T.Bảy 02/01/2010 10:23 am
Has thanked: 20 time
Been thanked: 2 time

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

Gửi bàigửi bởi thuyan1990 » T.Ba 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!

Hình đại diện của người dùng
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Bài viết: 1123
Ngày tham gia: T.Tư 24/09/2008 4:04 pm
Đến từ: TPHCM
Has thanked: 1 time
Been thanked: 28 time

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

Gửi bàigửi bởi tungcan5diop » T.Năm 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à

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!

Hình đại diện của người dùng
NoBi
Quản trị
Quản trị
Bài viết: 948
Ngày tham gia: T.Ba 18/03/2008 1:22 pm
Đến từ: Sài Gòn
Has thanked: 50 time
Been thanked: 66 time
Liên hệ:

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

Gửi bàigửi bởi NoBi » T.Năm 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("Đ"))
:>

Hình đại diện của người dùng
haitu
Guru
Guru
Bài viết: 206
Ngày tham gia: T.Bảy 10/09/2005 2:50 pm
Has thanked: 1 time
Been thanked: 19 time
Liên hệ:

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

Gửi bàigửi bởi haitu » T.Sáu 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
Bài viết: 299
Ngày tham gia: T.Bảy 02/01/2010 10:23 am
Has thanked: 20 time
Been thanked: 2 time

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

Gửi bàigửi bởi thuyan1990 » T.Sáu 03/12/2010 3:58 pm

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

vậy mà

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

Hình đại diện của người dùng
tungcan5diop
Cựu chiến binh
Cựu chiến binh
Bài viết: 1123
Ngày tham gia: T.Tư 24/09/2008 4:04 pm
Đến từ: TPHCM
Has thanked: 1 time
Been thanked: 28 time

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

Gửi bàigửi bởi tungcan5diop » T.Sáu 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!

Hình đại diện của người dùng
lungocqua
Guru
Guru
Bài viết: 1225
Ngày tham gia: T.Ba 18/08/2009 11:51 am
Đến từ: Phú Hữu - Nhơn Trạch - Đồng Nai
Been thanked: 5 time
Liên hệ:

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

Gửi bàigửi bởi lungocqua » T.Hai 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
Bài viết: 4
Ngày tham gia: T.Năm 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

Gửi bàigửi bởi zicusa » T.Sáu 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
Bài viết: 4
Ngày tham gia: CN 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

Gửi bàigửi bởi hieuvn » T.Hai 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


Quay về “[.NET] Mẹo vặt khác”

Đ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.2 khách