Tratamiento Unicode de una cadena

Trucos y Utilidades 10 de jun. de 2024

Los "otros" caracteres

Seguramente hayas tratado de escribir en algún blog, publicación o red social usando negrita o cursiva y el sitio no te lo permite.

Sin embargo, te puedes saltar esa restricción escribiendo otros caracteres que no son negrita, ni cursiva como tal.

Se trata de los caracteres Unicode, que se diseñaron para facilitar el tratamiento informático, la transmisión, y visualización de textos de numerosos idiomas y disciplinan técnicas, además de dar soporte a textos clásicos escritos en lenguas muertas.

El término Unicode proviene de los tres objetivos perseguidos:

  • Universalidad
  • Uniformidad
  • Unicidad

La vista te engaña.

Podemos usar caracteres que visualmente se ven como letras en negrita o cursiva y saltarnos esa limitación.

Fíjate en el siguiente texto: negrita 𝗼 𝗻𝗼 𝗻𝗲𝗴𝗿𝗶𝘁𝗮
A la vista ambos parecen estar escritos en negrita, pero es falso, la primera palabra efectivamente es negrita, pero la segunda frase o no negrita son caracteres matemáticos.

Lo mismo sucede con el texto:  cursiva 𝘰 𝘯𝘰 𝘤𝘶𝘳𝘴𝘪𝘷𝘢

Los sitios web tienen soporte para mostrar caracteres especiales y eso es lo que vamos a aprovechar.

Caracteres en Negrita (𝗠𝗮𝘁𝗵 𝗦𝗮𝗻𝘀-𝗦𝗲𝗿𝗶𝗳 𝗕𝗼𝗹𝗱)
Caracteres en Cursiva (𝘔𝘢𝘵𝘩 𝘚𝘢𝘯𝘴-𝘚𝘦𝘳𝘪𝘧 𝘐𝘵𝘢𝘭𝘪𝘤)

Script's en Bash (negrita/cursiva)

Al final del documento tienes los scripts para que los puedas descargar.

A continuación el código del script negrita, para que lo puedas revisar, el del script cursiva es identico excepto en el valor del desplazamiento:

#!/bin/bash
# Pedimos cadena de texto a transformar en negrita:
echo
echo "Escribe el texto a pasar a Negrita (y pulse INTRO)"
read CADENA

# Incremento decimal para alcanzar letra normal a negrita (Math Sans-Serif Bold)
# A:  hex=0041 (dec=65)   / 𝗔:  hex=1D5D4  (dec=120276) => INCR=120211
# a:  hex=0061 (dec=97)   / 𝗮:  hex=1D5EEE (dec=120302) => INCR=120205

# Leemos caracter a caracter
echo -n "$CADENA" | while IFS= read -d $'\000' -n 1 x
do 
  # MAY vs min
  if [ $(expr index "$x" "$(echo {a..z})") == 0 ] 
  then
    # Incremento para 'MAYUSCULAS'
    INCR=120211
  else
    # Incremento para 'minusculas'
    INCR=120205
  fi
  # Valor de letra a HEX
  letra=$(printf "%X" "'$x")
  if [ "$x" == " " ] 
  then # Si es espacio
    echo -ne " "
  else
    # calculo valor hex de la negrita
    hexnegrita=$(printf "%X" $((16#$letra + $INCR)))
    # imprimo en Unicode (si no es \n transformado"
    echo -en "\U$hexnegrita"
  fi 
done
echo -en "\n"

Te explico lo que hace el script:

  • Solicita la palabra o cadena de texto que quieras usar en la web que no permite negritas.
  • Procesa la cadena de texto letra a letra
  • Detecta si es una letra MAYUSCULA o si es minuscula para calcular el desplazamiento sobre el mapa Unicode
  • Calcula el valor Hexadecimal de la letra que ha leido y le suma el desplazamiento en decimal
  • Usa el valor obtenido para generar el código unicode.

Explicación rápida:
Si la letra A tiene un valor Hex de 0041
Y la letra 𝗔 tiene un valor Hex de 1D5D4
Para transformar la A en 𝗔 hay que avanzar 120276 posiciones en la tabla de caracteres unicode para poder usarla.

Ejemplo de uso del script para pasar a negrita:

$ ./negrita 

Escribe el texto a pasar a Negrita (y pulse INTRO)
Texto en Negrita MAY y min
𝗧𝗲𝘅𝘁𝗼 𝗲𝗻 𝗡𝗲𝗴𝗿𝗶𝘁𝗮 𝗠𝗔𝗬 𝘆 𝗺𝗶𝗻

Y el resultado del script para cursiva:

$ ./cursiva 

Escribe el texto a pasar a Cursiva (y pulse INTRO)
Texto en Cursiva MAY y min
𝘛𝘦𝘹𝘵𝘰 𝘦𝘯 𝘊𝘶𝘳𝘴𝘪𝘷𝘢 𝘔𝘈𝘠 𝘺 𝘮𝘪𝘯

El texto generado puedes copiarlo y pegarlo y te funcionará.

Limitaciones: No soporta acentos, ni ñ, ni símbolos, solo caracteres de la a..z y de la A..Z

Te dejo los scripts en bash con los que generar tu codigo en negrita y cursiva:

Recuerda que para sean ejecutables, tras descargarlos tienes que darles permisos de ejecución a ambos: chmod +x negrita cursiva

Espero que os haya sido util y curioso. De paso, si teneis intereres podeis revisar con detalle lo que hace el script, que se sale de las operaciones a las que podemos estar acostumbrado a diario.

Etiquetas

Luis GuLo

🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️ Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥 Formador de SysAdmin's - 💢 Ansible - ☁️ Cloud Computing - ❤️ Debian GNU/Linux