Thứ Sáu, 18 tháng 3, 2011

// // Leave a Comment

Loại bỏ các dấu tiếng về dạng không dấu C#

Đoạn codesnippet dưới đây cho phép chuyển chuỗi văn bản tiếng việt về dạng không dấu sử dụng C# kết hợp với Regex.
Bảng chữ cái tiếng việt
Các bước thực hiện như sau:
1. Sử dụng Regex tìm tất cả các ký tự tiếng việt có dấu
2. Thay thế ký tự vừa tìm được bởi ký tự tiếng việt không dấu tương ứng
3. Lặp tìm hết các ký tự có dấu trong bảng chữ cái tiếng việt
Cụ thể dưới đây là đoạn mã hoàn tất quá trình trên
// Chuyển tiếng việt có dấu thành không dấu
public unsafe static string RejectMarks(string text)
{
  string pattern = new string[7];
  char replaceChar = new char[14];

  // Khởi tạo giá trị thay thế

  replaceChar[0] = 'a';
  replaceChar[1] = 'd';
  replaceChar[2] = 'e';
  replaceChar[3] = 'i';
  replaceChar[4] = 'o';
  replaceChar[5] = 'u';
  replaceChar[6] = 'y';
  replaceChar[7] = 'A';
  replaceChar[8] = 'D';
  replaceChar[9] = 'E';
  replaceChar[10] = 'I';
  replaceChar[11] = 'O';
  replaceChar[12] = 'U';
  replaceChar[13] = 'Y';

  //Mẫu cần thay thế tương ứng

  pattern[0] = "(á|à|ả|ã|ạ|ă|ắ|ằ|ẳ|ẵ|ặ|â|ấ|ầ|ẩ|ẫ|ậ)"; //letter a
  pattern[1] = "đ"; //letter d
  pattern[2] = "(é|è|ẻ|ẽ|ẹ|ê|ế|ề|ể|ễ|ệ)"; //letter e
  pattern[3] = "(í|ì|ỉ|ĩ|ị)"; //letter i
  pattern[4] = "(ó|ò|ỏ|õ|ọ|ô|ố|ồ|ổ|ỗ|ộ|ơ|ớ|ờ|ở|ỡ|ợ)"; //letter o
  pattern[5] = "(ú|ù|ủ|ũ|ụ|ư|ứ|ừ|ử|ữ|ự)"; //letter u
  pattern[6] = "(ý|ỳ|ỷ|ỹ|ỵ)"; //letter y

  fixed (char* ptrChar = replaceChar)
  {
    for (int i = 0; i < pattern.Length; i++)
    {
      MatchCollection matchs = Regex.Matches(text, pattern[i], RegexOptions.IgnoreCase);
      foreach (Match m in matchs)
      {
        char ch = char.IsLower(m.Value[0]) ? *(ptrChar + i) : *(ptrChar + i + 7);
        text = text.Replace(m.Value[0], ch);
      }
    }
  }
  return text;
}
Tải xuống code mẫu: http://www.mediafire.com/?xhx8laots9hzdpr Một đoạn Regex code snippet khác khá ngắn hỗ trợ việc chuyển đổi tiếng việt về dạng không dấu.
        public string Change_AV(string ip_str_change)
        {
            Regex v_reg_regex = new Regex("\\p{IsCombiningDiacriticalMarks}+");
            string v_str_FormD = ip_str_change.Normalize(NormalizationForm.FormD);
            return v_reg_regex.Replace(v_str_FormD, String.Empty).Replace('\u0111', 'd').Replace('\u0110', 'D');
        }  

0 comments: