Tratamiento Unicode de una cadena
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 esminuscula
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 laa..z
y de laA..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.