Chuyển đến nội dung

Đếm ký tự

Có tính và không tính dấu cách, cùng số byte mà cơ sở dữ liệu và cổng SMS của bạn thực sự đo. Ở đây emoji được tính là một ký tự, vì bản chất nó là như vậy.

  • Không bao giờ lưu trữ
  • Không xếp hàng, không phải chờ
  • Không cần đăng ký, không watermark

0

Ký tự

như mắt người thấy

0

Không tính dấu cách

bỏ qua khoảng trắng

0

Từ

mọi ngôn ngữ

0

Byte UTF-8

như cơ sở dữ liệu đếm

Mọi số đếm, và nơi dùng đến chúng
DòngNhư trình soạn thảo đánh số
0
CâuKhông bị ngắt bởi “TS.” hay “v.v.”
0
Đoạn vănCác khối cách nhau bởi một dòng trống
0
Code pointNhững gì dấu “.” trong biểu thức chính quy khớp được
0
Đơn vị UTF-16Giá trị string.length trả về trong JavaScript
0
Byte UTF-8Thứ mà giới hạn VARCHAR và HTTP header đo
0
Thời gian đọcĐọc thầm, 238 từ mỗi phút
—
Thời gian nóiĐọc to, 150 từ mỗi phút
—
Từ dài nhấtTính theo ký tự, không theo byte
—
Độ dài từ trung bìnhChỉ báo sơ bộ về độ dễ đọc
—

Bắt đầu gõ là mọi số liệu hiện ra. Thử một emoji, hoặc một câu tiếng Trung — cả hai đều được đếm theo cách con người đếm, điều mà hầu hết công cụ đếm đều làm sai.

Cách hoạt động

1

Dán hoặc gõ

Số đếm cập nhật ngay khi bạn gõ. Không lưu trữ gì cả.

2

Chọn số đếm bạn cần

Số ký tự, số ký tự không tính dấu cách, code point hoặc byte UTF-8 — mỗi con số đều được hiển thị, kèm nơi dùng đến nó.

3

Theo dõi giới hạn

Tiêu đề SEO, meta description, số tin SMS và trường 255 byte đều được so với những gì bạn đã viết.

Bốn con số, vì “ký tự” có bốn nghĩa

Lấy ví dụ emoji gia đình, hoặc emoji giơ ngón cái có màu da. Con người thấy một ký tự. Nó được ghép từ nhiều code point nối với nhau bằng các ký tự nối vô hình, nên biểu thức chính quy thấy bảy. JavaScript lưu văn bản theo đơn vị 16 bit và mọi thứ nằm ngoài dải cơ bản chiếm hai đơn vị, nên nó báo mười một. Mã hóa UTF-8 cho một cột cơ sở dữ liệu, nó chiếm hai mươi lăm byte. Không con số nào sai và cũng không con số nào là đáp án — con số đúng hoàn toàn tùy vào thứ đang đặt ra giới hạn.

Vậy câu hỏi thực tế là ai đặt ra giới hạn. Một cột cơ sở dữ liệu khai báo VARCHAR đếm theo byte ở hầu hết hệ quản trị, đó là lý do một trường nhận được 255 ký tự tiếng Anh lại từ chối khi chưa tới số đó ký tự tiếng Nhật. Một tin nhắn SMS dài 160 ký tự trong bảng chữ cái 7 bit riêng của nó, và giảm xuống 70 ký tự mỗi tin ngay khi có một ký tự nằm ngoài bảng đó — chỉ một dấu nháy cong hay một emoji cũng có thể biến một tin thành ba. Bộ kiểm tra biểu mẫu viết bằng JavaScript gần như luôn đếm đơn vị UTF-16, đó là lý do một trường ghi 280 ký tự có thể từ chối một chuỗi trông ngắn hơn nhưng đầy emoji.

Số ký tự mà người đọc nhìn thấy là con số khó đếm nhất, và được tính bằng tính năng phân đoạn văn bản có sẵn của trình duyệt — cùng cơ chế quyết định con trỏ của bạn nhảy đến đâu khi nhấn phím mũi tên trái. Đó là định nghĩa đúng của “một ký tự” cho mọi thứ con người cảm nhận, và nó xử lý được những trường hợp làm cách đếm đơn giản bị sai: một chữ có dấu được viết bằng chữ cơ sở cộng dấu kết hợp vẫn là một, và các cụm chữ Hindi và Thái được đếm theo cách người đọc các hệ chữ đó đếm.

Với văn xuôi tiếng Anh thông thường, cả bốn con số đều bằng nhau, đó là lý do vấn đề này cứ ẩn mình cho đến khi lộ ra. Chúng khác nhau ở emoji, ở chữ có dấu và ký tự kết hợp, ở các hệ chữ không phải Latin và ở ký hiệu toán học — và đó chính là những dữ liệu khiến một trường bị cắt cụt âm thầm trong cơ sở dữ liệu ba tháng sau khi được xây dựng.

Khi bạn cần công cụ khác

Trong code, hãy dùng hàm đếm đúng thứ bạn cần thay vì độ dài mặc định. Intl.Segmenter trong JavaScript đếm những gì người đọc nhìn thấy; chuỗi trong Python 3 đếm code point và len(s.encode("utf-8")) đếm byte; PHP có mb_strlen và strlen chính là để phân biệt điều này. Mặc định trong hầu hết ngôn ngữ là cách nào tiện cho ngôn ngữ đó, hiếm khi là cách mà giới hạn của bạn muốn nói.

Khi một trường cơ sở dữ liệu là ràng buộc, cách sửa bền vững nằm ở phía gốc. Khai báo cột là utf8mb4 trong MySQL, hoặc text trong PostgreSQL, sẽ loại bỏ cả một nhóm lỗi cắt cụt — kiểu utf8 cũ trong MySQL nổi tiếng là chỉ có ba byte mỗi ký tự và hoàn toàn không lưu được emoji. Đếm cẩn thận ở biểu mẫu chỉ là cách chữa cháy cho một cột lẽ ra phải được khai báo khác.

Câu hỏi thường gặp

Văn bản của tôi có bị lưu trữ ở đâu không?

Không. Không lưu trữ gì cả và không gửi yêu cầu nào đi, và công cụ vẫn hoạt động khi đã ngắt mạng. Với văn bản, điều này quan trọng hơn bạn tưởng: thứ người ta dán vào công cụ đếm trực tuyến là bài viết chưa đăng, bản thảo pháp lý, bài làm của học sinh, sinh viên và tài liệu nội bộ.

Vì sao có bốn cách đếm ký tự khác nhau?

Vì “ký tự” có bốn nghĩa khác nhau và hầu hết công cụ chỉ biết một. Thứ BẠN thấy là một ký tự là một cụm grapheme — “é”, “🎉” và thậm chí “👨‍👩‍👧‍👦” đều là một. Thứ mà string.length của JavaScript báo là đơn vị mã UTF-16, theo đó emoji gia đình kia là 11. Thứ mà biểu thức chính quy khớp là code point, theo đó nó là 7. Còn thứ mà cột cơ sở dữ liệu hay HTTP header đo là BYTE UTF-8, theo đó nó là 25. Cả bốn đều được hiển thị ở đây, vì con số bạn cần tùy vào bên nào đặt ra giới hạn.

Một emoji là bao nhiêu ký tự?

Ở đây là một — vì với người đọc nó là như vậy, và đó là cách giới hạn ký tự trên các nền tảng hiện đại đếm. Ở nơi khác nó có thể là 2, 7 hoặc 11: “👨‍👩‍👧‍👦” là bốn người nối với nhau bằng ba ký tự nối vô hình, nên nó là 7 code point và 11 đơn vị mà string.length của JavaScript đếm. Nếu một biểu mẫu từ chối văn bản của bạn vì quá dài dù trông vẫn đủ ngắn, đây thường là lý do, và số byte trên trang này sẽ cho bạn thấy dung lượng thật.

Vì sao văn bản 200 ký tự của tôi không vừa trường cơ sở dữ liệu 255 ký tự?

Vì trường đó gần như chắc chắn giới hạn theo BYTE, không phải ký tự. Trong UTF-8, chữ cái tiếng Anh thông thường chiếm một byte mỗi chữ, nhưng chữ có dấu chiếm hai, còn chữ Trung, Nhật, Ả Rập và emoji chiếm ba hoặc bốn. Vì vậy 200 ký tự tiếng Nhật là 600 byte. Số byte được hiển thị ở đây chính vì lý do này — đó là con số cơ sở dữ liệu của bạn thực sự kiểm tra.

Vì sao một emoji làm giới hạn SMS của tôi giảm từ 160 xuống 70?

Vì tin nhắn SMS dùng một bảng chữ cái 7 bit gọn nhẹ chứa được 160 ký tự — và bảng chữ cái đó không có emoji, không có dấu nháy cong và gần như không có chữ có dấu. Chỉ một ký tự nằm ngoài bảng đó cũng chuyển TOÀN BỘ tin nhắn sang Unicode, và giới hạn giảm xuống 70. Một dấu nháy đơn cong dán từ Word cũng gây ra điều đó dễ dàng như một emoji. Đó là cách một tin nhắn ngắn bị tính tiền thành ba tin, và trang này báo cho bạn ngay khi điều đó xảy ra.

Công cụ có đếm dấu cách không?

Cả hai con số được hiển thị cùng lúc, nên bạn không cần phải chọn. Ký tự xuống dòng và tab cũng được tính là khoảng trắng.

Nên biết: Bốn con số, vì “ký tự” có bốn nghĩa và nghĩa bạn cần tùy vào bên nào đặt ra giới hạn. VARCHAR trong cơ sở dữ liệu đếm byte UTF-8, biểu thức chính quy đếm code point, JavaScript đếm đơn vị UTF-16, còn con người đếm những gì mắt thấy. Chúng chênh nhau nhiều nhất ở emoji.

Đặt công cụ này lên website của bạn

Miễn phí cho mọi blog, trang lớp học hay bài viết hướng dẫn. Chỉ cần dán một đoạn mã là khách truy cập có thể dùng ngay trên trang của bạn.