Skip to content

Instantly share code, notes, and snippets.

@hu2di
Last active March 1, 2025 13:15
Show Gist options
  • Select an option

  • Save hu2di/e80d99051529dbaa7252922baafd40e3 to your computer and use it in GitHub Desktop.

Select an option

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;
}
@bestinme122
Copy link
Copy Markdown

Thanks dong chi nhieu

@hungdev
Copy link
Copy Markdown

hungdev commented Jun 8, 2018

thiếu ký tự in hoa


function xoa_dau(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");
    return str;
}

@hakicode
Copy link
Copy Markdown

"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
Copy Markdown

mvhix9 commented Dec 5, 2018

Cảm ơn bạn nhiều

@khoailang99
Copy link
Copy Markdown

cảm ơn bạn!!!

@alang-dev
Copy link
Copy Markdown

"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
Copy Markdown

cảm ơn nhiều 😁😁

@lazidoca
Copy link
Copy Markdown

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
Copy Markdown

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
Copy Markdown

thanks @davistran86

@tannguyenit
Copy link
Copy Markdown

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
Copy Markdown
Author

hu2di commented Aug 27, 2020

Thank @hungdev and @tannguyenit.

@haile01
Copy link
Copy Markdown

haile01 commented Mar 23, 2021

Truly appreciate your work <3

@QuocDat269
Copy link
Copy Markdown

thanks

@gnoluv9x
Copy link
Copy Markdown

gnoluv9x commented Aug 6, 2021

thanks alot

@dev-panpic
Copy link
Copy Markdown

Great. Thank you so much

@phananhtrung
Copy link
Copy Markdown

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

@longnguyen28297
Copy link
Copy Markdown

Cảm ơn bạn

@PainterHalver
Copy link
Copy Markdown

Cảm ơn bạn nhiều

@minhquyn1204
Copy link
Copy Markdown

cảm ơn tiền bối

@lenhannhan123
Copy link
Copy Markdown

cảm ơn bạn

@Mrcryptonguyen
Copy link
Copy Markdown

gid:m9Jk3xmt8AiYwJAKhi5k89

@gnoluv9x
Copy link
Copy Markdown

gnoluv9x commented Mar 6, 2023

Tks for share :)

@quocthinhle
Copy link
Copy Markdown

Ok nice

@sylitas
Copy link
Copy Markdown

sylitas commented Jun 4, 2023

ngonnnnn thanks anh em

@FE-Tuanxinhtrai
Copy link
Copy Markdown

thanks

@hanti1999
Copy link
Copy Markdown

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

@nhiensoftcom
Copy link
Copy Markdown

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
Copy Markdown

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