Skip to content

Instantly share code, notes, and snippets.

@hu2di
Last active December 30, 2023 18:17
Show Gist options
  • Save hu2di/e80d99051529dbaa7252922baafd40e3 to your computer and use it in GitHub Desktop.
Save hu2di/e80d99051529dbaa7252922baafd40e3 to your computer and use it in GitHub Desktop.
JavaScript: Chuyển tiếng Việt có dấu sang không dấu
function removeVietnameseTones(str) {
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");
// Some system encode vietnamese combining accent as individual utf-8 characters
// Một vài bộ encode coi các dấu mũ, dấu chữ như một kí tự riêng biệt nên thêm hai dòng này
str = str.replace(/\u0300|\u0301|\u0303|\u0309|\u0323/g, ""); // ̀ ́ ̃ ̉ ̣ huyền, sắc, ngã, hỏi, nặng
str = str.replace(/\u02C6|\u0306|\u031B/g, ""); // ˆ ̆ ̛ Â, Ê, Ă, Ơ, Ư
// Remove extra spaces
// Bỏ các khoảng trắng liền nhau
str = str.replace(/ + /g," ");
str = str.trim();
// Remove punctuations
// Bỏ dấu câu, kí tự đặc biệt
str = str.replace(/!|@|%|\^|\*|\(|\)|\+|\=|\<|\>|\?|\/|,|\.|\:|\;|\'|\"|\&|\#|\[|\]|~|\$|_|`|-|{|}|\||\\/g," ");
return str;
}
@hakicode
Copy link

"PHẦN MỘT. LỊCH SỬ THẾ GIỚI THỜI NGUYÊN THỦY, CỔ ĐẠI VÀ TRUNG ĐẠI"
Không convert được chữ "thủy"

@mvhix9
Copy link

mvhix9 commented Dec 5, 2018

Cảm ơn bạn nhiều

@khoailang99
Copy link

cảm ơn bạn!!!

@alang-dev
Copy link

"PHẦN MỘT. LỊCH SỬ THẾ GIỚI THỜI NGUYÊN THỦY, CỔ ĐẠI VÀ TRUNG ĐẠI"
Không convert được chữ "thủy".
Chữ "thủy" không convert được là do dấu hỏi nó là một ký tự riêng, nếu chạy loop bạn sẽ thấy "thủy" -> [t, h, u, "dấu hỏi", y]

@huynguyen-hl
Copy link

cảm ơn nhiều 😁😁

@lazidoca
Copy link

lazidoca commented Jul 23, 2019

1 cách khác ngắn gọn hơn với ES2015/ES6 String.Prototype.Normalize()

const str = "PHẦN MỘT. LỊCH SỬ THẾ GIỚI THỜI NGUYÊN THỦY, CỔ ĐẠI VÀ TRUNG ĐẠI";
const newStr = str.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
console.log(newStr)
>> PHAN MOT. LICH SU THE GIOI THOI NGUYEN THUY, CO ĐAI VA TRUNG ĐAI

@davistran86
Copy link

davistran86 commented Jul 29, 2019

@lazidoca: chữ Đ vẫn bị bạn ơi. Chuyển thành kiểu này thì xử luôn chữ Đ:

str
      .normalize("NFD")
      .replace(/[\u0300-\u036f]/g, "")
      .replace(/đ/g, "d")
      .replace(/Đ/g, "D");

@chellongCoder
Copy link

thanks @davistran86

@tannguyenit
Copy link

tannguyenit commented Aug 26, 2020

function convertViToEn(str, toUpperCase = false) {
    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");
    // Some system encode vietnamese combining accent as individual utf-8 characters
    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, ""); // Â, Ê, Ă, Ơ, Ư

    return toUpperCase ? str.toUpperCase() : str;
}

Pls try this!

@hu2di
Copy link
Author

hu2di commented Aug 27, 2020

Thank @hungdev and @tannguyenit.

@haile01
Copy link

haile01 commented Mar 23, 2021

Truly appreciate your work <3

@QuocDat269
Copy link

thanks

@gnoluv9x
Copy link

gnoluv9x commented Aug 6, 2021

thanks alot

@dev-panpic
Copy link

Great. Thank you so much

@phananhtrung
Copy link

có vẻ đã hoàn thiện. cảm ơn bạn

@longnguyen28297
Copy link

Cảm ơn bạn

@PainterHalver
Copy link

Cảm ơn bạn nhiều

@minhquyn1204
Copy link

cảm ơn tiền bối

@lenhannhan123
Copy link

cảm ơn bạn

@Mrcryptonguyen
Copy link

gid:m9Jk3xmt8AiYwJAKhi5k89

@gnoluv9x
Copy link

gnoluv9x commented Mar 6, 2023

Tks for share :)

@quocthinhle
Copy link

Ok nice

@sylitas
Copy link

sylitas commented Jun 4, 2023

ngonnnnn thanks anh em

@17021110
Copy link

thanks

@hanti1999
Copy link

hanti1999 commented Jul 6, 2023

Cảm ơn bạn, mình cần thêm dấu gạch nối nữa nên đã tìm được cái này:
/*
str = str.replace(/\W+/g, ' ');
str = str.replace(/\s/g, '-');
*/
Thêm 2 cái này ở cuối để chuyển khoảng trắng thành dấu gạch nối
ví dụ: Viet Nam => Viet-Nam

@vuduynhiennn
Copy link

cảm ơn bạn nhiều nha trông không tối ưu lắm nhưng lúc chạy thấy ra kết quả ok

@cunghayday
Copy link

cunghayday commented Oct 3, 2023

Xin cảm ơn bạn, đúng thứ tôi dang cần. Nhưng tôi thấy bạn nên để phần xoá nhiều khoảng trắng sau phần xoá ký tự đặc biệt, bởi vì sau khi xoá ký tự đặc biệt đôi khi lại xuất hiện trường hợp 2 khoảng trắng liền kề. Xoá ký tự đặc biệt theo tôi nên dùng str = str.replace(/[^a-zA-Z0-9 ]/g, ""); thì đỡ phức tạp hơn.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment