Saltar al contenido

Contar caracteres

Con espacios y sin ellos, más el conteo de bytes que realmente miden tu base de datos y tu pasarela de SMS. Aquí los emoji cuentan como un carácter, porque eso es lo que son.

  • Nunca se guarda
  • Sin filas ni esperas
  • Sin registro, sin marca de agua

0

Caracteres

lo que ve una persona

0

Sin espacios

sin contar espacios en blanco

0

Palabras

en cualquier idioma

0

Bytes UTF-8

lo que cuenta una base de datos

Todos los recuentos y para qué sirve cada uno
LíneasTal como las numera un editor
0
OracionesNo se cortan por “Dr.” ni “etc.”
0
PárrafosBloques separados por una línea en blanco
0
Puntos de códigoLo que coincide con “.” en una expresión regular
0
Unidades UTF-16Lo que devuelve string.length en JavaScript
0
Bytes UTF-8Lo que miden un límite VARCHAR y los encabezados HTTP
0
Tiempo de lecturaEn silencio, a 238 palabras por minuto
—
Tiempo de hablaEn voz alta, a 150 palabras por minuto
—
Palabra más largaPor caracteres, no por bytes
—
Palabra promedioUna señal aproximada de legibilidad
—

Empieza a escribir y todo se completa. Prueba con un emoji o con una oración en chino: ambos se cuentan como los contaría una persona, algo en lo que la mayoría de los contadores fallan.

Cómo funciona

1

Pega o escribe

El conteo se actualiza sobre la marcha. No se guarda nada.

2

Elige el conteo que necesitas

Caracteres, caracteres sin espacios, puntos de código o bytes UTF-8: se muestra cada uno, con lo que lo usa.

3

Vigila tu límite

Los títulos SEO, las meta descripciones, los segmentos de SMS y un campo de 255 bytes se comparan con lo que has escrito.

Cuatro cifras, porque “carácter” tiene cuatro significados

Toma el emoji de una familia, o un pulgar arriba con un tono de piel. Una persona ve un carácter. Está formado por varios puntos de código unidos por conectores invisibles, así que una expresión regular ve siete. JavaScript guarda el texto en unidades de 16 bits y todo lo que queda fuera del rango básico ocupa dos, así que informa once. Codificado como UTF-8 para una columna de base de datos, ocupa veinticinco bytes. Ninguna de estas cifras es incorrecta y ninguna es la respuesta: la correcta depende por completo de qué impone el límite.

Así que la pregunta práctica es quién impuso el límite. Una columna de base de datos declarada como VARCHAR cuenta bytes en la mayoría de los motores, y por eso un campo que acepta 255 caracteres en inglés rechaza muchos menos en japonés. Un SMS tiene 160 caracteres en su propio alfabeto de siete bits, y baja a 70 por mensaje en cuanto un carácter queda fuera de él: una sola comilla tipográfica o un emoji puede convertir un mensaje en tres. Un validador de formularios en JavaScript casi siempre cuenta unidades UTF-16, y por eso un campo que dice 280 caracteres puede rechazar una cadena que parece más corta pero está llena de emoji.

El conteo de lo que ve un lector es el más difícil, y se hace con la segmentación de texto del propio navegador, el mismo mecanismo que decide adónde va el cursor cuando pulsas la flecha izquierda. Esa es la definición correcta de “un carácter” para todo lo que percibe una persona, y resuelve los casos que confunden a los conteos más simples: una letra acentuada escrita como letra base más una marca combinada cuenta como una, y los grupos del hindi y del tailandés se cuentan como los contaría un lector de esas escrituras.

En prosa inglesa común, las cuatro cifras son idénticas, y por eso el problema pasa desapercibido hasta que deja de hacerlo. Divergen con los emoji, los caracteres acentuados y combinados, las escrituras no latinas y los símbolos matemáticos, y esas son justo las entradas que hacen que un campo se trunque sin aviso en una base de datos tres meses después de haberse creado.

Si buscas otra cosa

En el código, usa una función que cuente lo que necesitas en lugar de la longitud predeterminada. Intl.Segmenter en JavaScript cuenta lo que ve un lector; las cadenas de Python 3 cuentan puntos de código y len(s.encode("utf-8")) cuenta bytes; PHP tiene mb_strlen frente a strlen justo para esta distinción. El valor predeterminado en la mayoría de los lenguajes es el que le resultó cómodo al lenguaje, que rara vez es el que quiere decir tu límite.

Cuando la restricción es un campo de base de datos, la solución duradera está antes. Declarar una columna como utf8mb4 en MySQL, o como text en PostgreSQL, elimina toda una clase de errores de truncamiento; el antiguo utf8 de MySQL es, como se sabe, de solo tres bytes por carácter y no puede guardar ningún emoji. Contar con cuidado en el formulario es un parche para una columna que debió declararse de otra manera.

Preguntas frecuentes

¿Se guarda mi texto en algún lugar?

No. No se guarda nada ni se hace ninguna solicitud, y sigue funcionando sin conexión a la red. Con el texto, eso importa más de lo que parece: lo que la gente pega en un contador en línea son escritos inéditos, borradores legales, trabajos de estudiantes y documentos internos.

¿Por qué hay cuatro conteos de caracteres distintos?

Porque un “carácter” tiene cuatro significados distintos y la mayoría de las herramientas solo conoce uno. Lo que TÚ ves como un carácter es un grupo de grafemas: “é”, “🎉” e incluso “👨‍👩‍👧‍👦” son uno cada uno. Lo que informa string.length de JavaScript son unidades de código UTF-16, donde ese emoji de familia vale 11. Lo que reconoce una expresión regular son puntos de código, donde vale 7. Y lo que mide una columna de base de datos o un encabezado HTTP son BYTES UTF-8, donde vale 25. Aquí se muestran los cuatro, porque el que necesitas depende de quién impone el límite.

¿Cuántos caracteres es un emoji?

Uno, aquí, porque eso es lo que es para la persona que lo lee, y es lo que cuenta un límite de caracteres en una plataforma moderna. En otros lugares puede valer 2, 7 u 11: “👨‍👩‍👧‍👦” son cuatro personas unidas por tres caracteres de unión invisibles, así que son 7 puntos de código y 11 de las unidades que cuenta string.length de JavaScript. Si un formulario rechazó tu texto por ser demasiado largo cuando parecía bastante corto, casi siempre es por esto, y el conteo de bytes de esta página te mostrará el tamaño real.

¿Por qué mi texto de 200 caracteres no cupo en un campo de base de datos de 255 caracteres?

Porque casi seguro que el campo limita BYTES, no caracteres. En UTF-8, las letras inglesas simples ocupan un byte cada una, pero las letras acentuadas ocupan dos, y el chino, el japonés, el árabe y los emoji ocupan tres o cuatro. Así que 200 caracteres en japonés son 600 bytes. El conteo de bytes se muestra aquí precisamente por eso: es el número que tu base de datos está comprobando en realidad.

¿Por qué un emoji reduce mi límite de SMS de 160 a 70?

Porque un mensaje de texto usa un alfabeto compacto de 7 bits que admite 160 caracteres, y ese alfabeto no tiene emoji, ni comillas tipográficas, y casi ningún acento. Un solo carácter fuera de él pasa TODO el mensaje a Unicode, y el límite baja a 70. Un apóstrofo tipográfico pegado desde Word lo provoca igual de fácil que un emoji. Así es como un mensaje corto se cobra como tres, y la página te avisa en cuanto ocurre.

¿Cuenta los espacios?

Se muestran las dos cifras a la vez, así que no tienes que elegir. Los saltos de línea y las tabulaciones también cuentan como espacio en blanco.

Conviene saber: Cuatro cifras, porque “carácter” tiene cuatro significados y el que necesitas depende de quién impone el límite. Un VARCHAR de una base de datos cuenta bytes UTF-8, una expresión regular cuenta puntos de código, JavaScript cuenta unidades UTF-16 y una persona cuenta lo que ve. Donde más discrepan es en los emoji.

Agrega esta herramienta a tu sitio web

Gratis para cualquier blog, página de clase o artículo de ayuda. Pega un fragmento de código y tus visitantes podrán usarla directamente en tu página.