Hôm nay, mình sẽ chia sẻ một đoạn mã JavaScript hữu ích giúp chuyển đổi văn bản tiếng Việt có dấu sang không dấu. Đây là một kỹ thuật thường được sử dụng trong xử lý dữ liệu, tìm kiếm, và nhiều ứng dụng khác.
Việc chuyển đổi tiếng Việt có dấu sang không dấu là một bài toán khá phổ biến trong lập trình. Có nhiều cách để thực hiện việc này, và dưới đây là một hàm JavaScript gọn gàng và hiệu quả mà mình muốn giới thiệu:
export default function nonAccentVietnamese(str: string) {
str = str.toLowerCase();
str = str.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, "a");
str = str.replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g, "e");
str = str.replace(/ì|í|ị|ỉ|ĩ/g, "i");
str = str.replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g, "o");
str = str.replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g, "u");
str = str.replace(/ỳ|ý|ỵ|ỷ|ỹ/g, "y");
str = str.replace(/đ/g, "d");
str = str.replace(/À|Á|Ạ|Ả|Ã|Â|Ầ|Ấ|Ậ|Ẩ|Ẫ|Ă|Ằ|Ắ|Ặ|Ẳ|Ẵ/g, 'A')
str = str.replace(/È|É|Ẹ|Ẻ|Ẽ|Ê|Ề|Ế|Ệ|Ể|Ễ/g, 'E')
str = str.replace(/Ì|Í|Ị|Ỉ|Ĩ/g, 'I')
str = str.replace(/Ò|Ó|Ọ|Ỏ|Õ|Ô|Ồ|Ố|Ộ|Ổ|Ỗ|Ơ|Ờ|Ớ|Ợ|Ở|Ỡ/g, 'O')
str = str.replace(/Ù|Ú|Ụ|Ủ|Ũ|Ư|Ừ|Ứ|Ự|Ử|Ữ/g, 'U')
str = str.replace(/Ỳ|Ý|Ỵ|Ỷ|Ỹ/g, 'Y')
str = str.replace(/Đ/g, 'D')
str = str.replace(/\u0300|\u0301|\u0303|\u0309|\u0323/g, ""); // Huyền sắc hỏi ngã nặng
str = str.replace(/\u02C6|\u0306|\u031B/g, ""); // Â, Ê, Ă, Ơ, Ư
// Loại bỏ các ký tự đặc biệt
// str = str.replace(/[^a-zA-Z0-9 \s]/g, "")
return str;
}
console.log(nonAccentVietnamese('Phan Nhật Chánh')); // => "Phan Nhat Chanh"
console.log(nonAccentVietnamese('Nguyễn Văn A')); // => "Nguyen Van A"
console.log(nonAccentVietnamese('Tôi yêu Việt Nam')); // => "Toi yeu Viet Nam"
Giải thích Code
str.toLowerCase()
Chuyển đổi toàn bộ chuỗi sang chữ thường để việc so sánh và thay thế được dễ dàng hơn.str.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, "a");
Đây là dòng lệnh cốt lõi. Nó sử dụng biểu thức chính quy (regular expression) để tìm tất cả các ký tự nguyên âm "a" với các dấu khác nhau (à, á, ạ, ả, ã, â, ầ, ấ, ậ, ẩ, ẫ, ă, ằ, ắ, ặ, ẳ, ẵ) và thay thế chúng bằng chữ "a" không dấu. Các dòng lệnh tương tự được áp dụng cho các nguyên âm khác (e, i, o, u, y) và chữ "đ".- Xử lý chữ in hoa: Các dòng lệnh tương tự như trên nhưng áp dụng cho chữ in hoa (À, Á, Ạ...) để đảm bảo xử lý đúng cả chữ hoa và chữ thường.
str.replace(/\u0300|\u0301|\u0303|\u0309|\u0323/g, "");
Loại bỏ các dấu thanh (huyền, sắc, hỏi, ngã, nặng) bằng cách sử dụng mã Unicode.str.replace(/\u02C6|\u0306|\u031B/g, "");
Loại bỏ các dấu mũ và dấu móc (â, ê, ă, ơ, ư).
Ưu điểm
- Đơn giản và dễ hiểu: Code khá ngắn gọn và dễ đọc, dễ dàng cho người mới bắt đầu.
- Hiệu quả: Sử dụng biểu thức chính quy giúp xử lý nhanh chóng.
- Đầy đủ: Xử lý cả chữ hoa, chữ thường và các dấu thanh, dấu mũ đầy đủ.
Ứng dụng
Hàm này có thể được sử dụng trong nhiều trường hợp, ví dụ:
- Tìm kiếm: Giúp tìm kiếm chính xác hơn khi người dùng nhập liệu không dấu.
- Xử lý dữ liệu: Chuẩn hóa dữ liệu trước khi lưu vào cơ sở dữ liệu.
- URL slug: Tạo URL thân thiện với SEO.
Hy vọng đoạn mã này sẽ hữu ích cho các bạn trong quá trình lập trình. Nếu có bất kỳ câu hỏi nào, đừng ngần ngại để lại bình luận bên dưới nhé! Chúc các bạn thành công!