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;
}
@ThuanLCSE

Copy link
Copy Markdown

Cám ơn hu2di

@bestinme122

Copy link
Copy Markdown

Thanks dong chi nhieu

@hungdev

hungdev commented Jun 8, 2018

Copy link
Copy Markdown

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

mvhix9 commented Dec 5, 2018

Copy link
Copy Markdown

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

lazidoca commented Jul 23, 2019

Copy link
Copy Markdown

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

davistran86 commented Jul 29, 2019

Copy link
Copy Markdown

@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

tannguyenit commented Aug 26, 2020

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

hu2di commented Aug 27, 2020

Copy link
Copy Markdown
Author

Thank @hungdev and @tannguyenit.

@haile01

haile01 commented Mar 23, 2021

Copy link
Copy Markdown

Truly appreciate your work <3

@QuocDat269

Copy link
Copy Markdown

thanks

@gnoluv9x

gnoluv9x commented Aug 6, 2021

Copy link
Copy Markdown

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

gnoluv9x commented Mar 6, 2023

Copy link
Copy Markdown

Tks for share :)

@quocthinhle

Copy link
Copy Markdown

Ok nice

@sylitas

sylitas commented Jun 4, 2023

Copy link
Copy Markdown

ngonnnnn thanks anh em

@FE-Tuanxinhtrai

Copy link
Copy Markdown

thanks

@hanti1999

hanti1999 commented Jul 6, 2023

Copy link
Copy Markdown

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

cunghayday commented Oct 3, 2023

Copy link
Copy Markdown

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