Soi ký tự Unicode
Xem điểm mã, byte UTF-8/UTF-16 và chuỗi thoát của từng ký tự
Về công cụ này
Dán bất kỳ văn bản nào vào và xem từng ký tự được mổ xẻ: điểm mã (U+XXXX), byte UTF-8, đơn vị UTF-16, chuỗi thoát trong JavaScript, thực thể HTML và phân loại chung — kèm tổng số điểm mã, đơn vị UTF-16, byte UTF-8 và số ký tự theo cảm nhận người dùng (cụm grapheme).
Đây là công cụ dành cho những lúc “sao cái chuỗi này kỳ vậy?”: các ký tự vô hình (khoảng trắng rộng bằng không, BOM, dấu chỉ hướng) hiện ra thành từng hàng nhìn thấy được; những ký tự trông giống nhau (а Kirin và a Latinh) lộ ra điểm mã khác nhau; còn một emoji tưởng “chỉ là một ký tự” hóa ra là bảy điểm mã nối với nhau bằng ký tự ghép rộng bằng không.
Bốn con số độ dài khác nhau trả lời câu hỏi muôn thuở: vì sao .length của JavaScript, giới hạn byte của cơ sở dữ liệu, và thứ người dùng nhìn thấy chẳng bao giờ đồng ý với nhau về độ dài một chuỗi.
Câu hỏi thường gặp
- Vì sao trong JavaScript "🎉".length === 2?
- Chuỗi trong JavaScript đếm theo đơn vị mã UTF-16. Những ký tự vượt quá U+FFFF — trong đó có phần lớn emoji — cần một cặp thay thế, tức hai đơn vị. Công cụ hiển thị cả hai đơn vị lẫn điểm mã thật, và phần tổng kết đếm chúng riêng rẽ.
- Cụm grapheme là gì?
- Là thứ mà người đọc cảm nhận như một ký tự. Chữ é có thể gồm hai điểm mã (e + dấu ghép), còn emoji gia đình có thể gồm bảy điểm mã trở lên nối bằng ký tự ghép rộng bằng không. Số grapheme được tính bằng Intl.Segmenter của trình duyệt — thứ gần nhất với “ký tự như người dùng nhìn thấy”.
- Làm sao tìm ký tự vô hình trong một chuỗi?
- Hãy dán nó vào đây — mỗi điểm mã đều có một hàng riêng, kể cả khoảng trắng rộng bằng không (U+200B), khoảng trắng không ngắt (U+00A0), BOM (U+FEFF) và các dấu chỉ hướng, mỗi thứ đều được gắn nhãn phân loại. Đây chính là những thủ phạm kinh điển đứng sau các chuỗi “giống hệt nhau” mà so sánh bằng lại không khớp.
- Dãy byte UTF-8 cho tôi biết điều gì?
- Đúng những gì sẽ được lưu hoặc truyền đi: ASCII một byte, phần lớn phần mở rộng Latinh hai byte, CJK ba byte, emoji bốn byte. Nếu một hệ thống cắt ngang giữa dãy byte, bạn sẽ nhận được ký tự thay thế (�) — khung xem byte cho thấy những nhát cắt như vậy sẽ rơi vào đâu.