Việc cần làm

Nhập văn bản để xem kết quả.

Chữ Đ được xử lý riêng vì bảng mã Unicode không tách nó thành chữ cái gốc và dấu như các chữ có dấu khác.

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.

Nguồn tham khảo

Báo lỗi cho quản trị viênThấy kết quả sai, số liệu đã lỗi thời hay lỗi hiển thị? Gửi báo cáo ngay tại đây. Đường dẫn trang và tên công cụ được đính kèm sẵn, bạn chỉ cần mô tả vấn đề.

Báo lỗi cho quản trị viên

Mô tả càng cụ thể càng nhanh sửa: bạn đã nhập gì, kết quả nhận được và kết quả bạn cho là đúng.

Vấn đề thuộc loại nào?
0/2000

Chỉ dùng để trả lời bạn, không dùng vào việc gì khác.

Gửi kèm báo cáo

Trang
/bo-dau-tieng-viet
Công cụ
Bỏ dấu tiếng Việt
Ngôn ngữ
Tiếng Việt

Các giá trị bạn nhập trong công cụ không được gửi đi. Ngoài những thông tin dưới đây, máy chủ ghi lại loại trình duyệt và dùng địa chỉ IP để giới hạn tần suất gửi — chi tiết ở trang Chính sách bảo mật.