Bỏ dấu tiếng Việt
Bỏ dấu, tạo slug thân thiện URL và đổi kiểu chữ — kèm bộ đếm ký tự.
Nhập văn bản để xem kết quả.
Cách tính
Chữ tiếng Việt có dấu được lưu trong Unicode theo hai cách. Cách dựng sẵn lưu "ế" như một ký tự duy nhất; cách tổ hợp lưu nó thành chữ "e" cộng thêm hai dấu rời — dấu mũ và dấu sắc. Hai cách trông hệt nhau trên màn hình nhưng là hai chuỗi byte khác nhau, và đó là lý do việc bỏ dấu bằng cách tìm-thay-thế từng chữ luôn sót trường hợp.
Cách làm đúng là chuẩn hoá về dạng tổ hợp trước — hàm normalize("NFD") của JavaScript — rồi xoá mọi dấu thanh và dấu phụ trong khoảng U+0300 đến U+036F. Khi đó "ế", "ộ", "ữ" đều tự tách thành chữ cái gốc và các dấu, và chỉ còn chữ cái ở lại.
Riêng chữ Đ thì cách này không xử lý được. Unicode không có dạng tổ hợp cho Đ: nó không phải "D cộng một dấu", mà là một chữ cái riêng biệt. Nên Đ và đ phải được thay bằng D và d bằng một bảng viết tay, trước khi chuẩn hoá. Đây là điểm gần như mọi đoạn mã bỏ dấu tìm được trên mạng đều bỏ sót.
Khi tạo slug, sau bước bỏ dấu mọi ký tự không phải chữ cái hay chữ số ASCII được gom lại thành một dấu nối duy nhất, rồi cắt bỏ dấu nối ở đầu và cuối — nếu không, một câu kết thúc bằng dấu chấm sẽ cho ra slug có dấu gạch thừa ở cuối, và đó là một đoạn URL không hợp lệ.
Công thức
bỏ dấu = thay Đ→D, đ→d → normalize("NFD") → xoá ký tự trong khoảng U+0300–U+036F
Khoảng U+0300–U+036F là khối "Combining Diacritical Marks". Giới hạn đúng khối này thay vì xoá mọi dấu Unicode để một tên viết bằng chữ Hindi hay tiếng Nhật không bị cắt xén oan.
Ví dụ
Đưa tiêu đề "Đổi lịch âm dương" thành slug:
- Chuỗi gốc
- Đổi lịch âm dương
- Sau khi thay Đ
- Doổi lịch âm dương → Dổi lịch âm dương
- Sau NFD và xoá dấu
- Doi lich am duong
- Gom ký tự đặc biệt, viết thường
- doi-lich-am-duong
Nếu bỏ qua bước thay Đ, kết quả là "Đoi-lich-am-duong" — chữ Đ nguyên vẹn nằm giữa một slug, khiến URL phải mã hoá phần trăm và không còn khớp với đường dẫn thật.
Câu hỏi thường gặp
Vì sao chữ Đ phải xử lý riêng?
Vì trong Unicode, Đ không phải là chữ D cộng một dấu phụ mà là một chữ cái độc lập, không có dạng tách. Phép chuẩn hoá NFD vì thế để nguyên nó. Bảng thay thế viết tay là cách duy nhất xử lý đúng.
Slug là gì và vì sao cần nó?
Slug là phần đường dẫn dễ đọc trong URL, ví dụ /doi-lich-am-duong. Nó cần chỉ gồm chữ thường, số và dấu nối, vì mọi ký tự khác phải mã hoá phần trăm — làm URL vừa xấu vừa dễ hỏng khi sao chép.
camelCase, snake_case và kebab-case khác nhau thế nào?
Chúng chỉ khác nhau ở cách nối các từ: camelCase viết hoa chữ đầu mỗi từ trừ từ đầu tiên, snake_case nối bằng gạch dưới, kebab-case nối bằng gạch nối. Đây là quy ước đặt tên trong lập trình, chọn cái nào tuỳ ngôn ngữ và dự án bạn đang làm.
Vì sao bốn kiểu chữ lập trình lại bỏ dấu, còn Title Case thì không?
Vì camelCase, PascalCase, snake_case và CONSTANT_CASE là tên định danh trong mã nguồn, mà rất ít nơi chấp nhận định danh có dấu. Còn Title Case và kiểu chữ hoa đầu câu là văn xuôi, nên giữ nguyên dấu là đúng.
Bộ đếm ký tự đếm emoji thế nào?
Một emoji được đếm là một ký tự. Nếu dùng cách đếm mặc định của JavaScript thì phần lớn emoji bị tính thành hai, vì chúng chiếm hai đơn vị mã UTF-16 — và giới hạn ký tự của các nền tảng thì đếm theo ký tự thật.
Văn bản tôi dán vào có được gửi đi đâu không?
Không. Mọi phép chuyển đổi chạy bằng JavaScript trên máy bạn. Trang này là tệp HTML tĩnh, không có máy chủ nào nhận nội dung bạn nhập.