Diario de un picateclas Profile picture
Soy un programador de 💩 y pico código de dudosa calidad (aka "picar mierda"). También soy una persona de 💩, pero ese es otro tema

May 14, 2021, 24 tweets

Sheldon tenía un "Fun with Flags", yo tengo un "Fun with Strings". Por demanda popular, ¡DENTRO HILO! ⬇

Todo empezó hace un porrón de años cuando los arcanos de los 0 y los 1 inventaron la tabla ASCII.
Majestuosa tabla que contenía absolutamente todas las letras, números y símbolos. Todos los
que se les ocurrieron en 1 tarde, quiero decir.

Y todo era maravilloso, porque con 1 byte representábamos cualquier carácter.
Y para medir "la longitud" de una cadena nos bastaba con contar cuántos bytes tenía, porque 1 letra = 1 byte.
Y para pasar de mayusculas a minúsculas sumabas 32 al valor decimal del carácter y pista.

Luego vino una gente muy rara (fuera de yankilandia) y dijo algo de usar tildes, runas, escribir al revés en plan posesión demoniaca. En fin, una flipada del copón...

Unicode al rescate! Ponemos 4bytes por letra y con eso ya podemos crear una tabla ASCII XXL

Y por un momento parecía que todo estaba apañado. Excepto que no, porque eso de meter 4 donde antes cabía solo 1 no termina de funcionar bien, ni siquiera comprando la licencia del Winrar

"Pues hagamos que a veces los caracteres sean de 1 byte, a veces de 4, a veces de 2 o de 3, según por donde sople el viento".

Dicho y hecho! "UTF-8", "UTF-16", "ISO-8859-1" y 9157238 otros "charsets" al rescate! Porque cuantos más estándares, mejor!

Ahora metes "¡Qué mañana llevo!" en tu formulario de React, lo mandas a tu backend de PHP que lo lee como "!Qué manana llevo!" y este lo manda a tu base de datos MySQL que lo guarda como "�Qu� ma�ana llevo!"

"Bueno, pero una vez controlado el tema de charsets y usando el mismo en todos los sitios, todo funciona bien, no?"

Mmm.... casi!

Lo que dije antes, lo de "medir la longitud de las cadenas"... Os vais a reír, pero... resulta que ahora ya no sabemos ni como medirlas, porque...

"a" es 1 byte

"ñ" son 2 bytes

"ƒ" son 3 bytes

el glifo (emoji) "😂" son 4 bytes (1 codepoint)

el glifo "👩‍👩‍👦‍👦" en realidad son 4 glifos "unidos" (👩+👩+👦+👦), que son 4 codepoints unidos con 3 "caracteres de union"), 25 bytes en total (7 codepoints, pero sólo 1 glifo)

Eso ocurre porque Unicode define caracteres que pueden modificar e incluso unir otros caracteres, entre otras cosas...

Gracias a esos "modificadores" la letra "ñ"

(U+00F1, 1 carácter, 1 codepoint, 2 bytes)

también puede representarse como la union del carácter "n"

(U+006E, 1 carácter, 1 codepoint, 2 bytes)

y el carácter "~"

(U+0342, 2 bytes)

➡ "n͂" (1 carácter, 2 codepoints, 4 bytes)

Supongo que nada me impide modificar caracteres varias veces... ¯\_(ツ)_/¯

Ese último garabato que se ve ahi es un único glifo con 16 codepoints y un total de 31 bytes. Si nos ponemos tontos... A̷̢̢̛̛̛̱̳͚̺̙͙̗͎̱̖̲̙̬͚̳̟͔̤̲̻̪͇̪͕͖͓͔̤̟̫̬̙̯̻͙̥̣̝̮̭͓̱̥͇͔̗̗̳̜͚͊̉̐̐̀͋̋͑͐̅̑̆̌̇̂̓̂̅̆̌̈́́́̎̊̏͋̿̎͌̐̎̕̚̕͘͘͜ͅ ...😂

Entonces que miden las funciones tipo strlen()? Miden caracteres? Miden bytes? Miden codepoints? Miden glifos?

Ni nos ponemos de acuerdo en decidir que deberían medir:

"Vale, me queda claro. No se pueden 'medir' cadenas de texto. Pero excepto esto, el resto bien, verdad?"

Pues... tampoco sabemos como convertir entre minúsculas y mayusculas...😂

Verás... La letra "ß" (aleman) ni siquiera tiene mayúscula. No existe!

Pero las funciones "toUpperCase()" de los lenguajes de programación algo deben hacer, así que...

La mayúscula "Σ" griega se convierte en minúscula "ς" únicamente si es la última letra de la palabra, en caso contrario "σ".

En holandés, el dígrafo "IJ/ij" se capitaliza entero, es decir, "IJsland" en vez de "Ijsland".

En hawaiano la "okina" (U+02BB) (visualmente se representa con un apóstrofo) es una consonante que modifica el sonido de la letra que precede. Al capitalizar una palabra con okina, debe ser la letra después de la okina la que se transforme: 'okina -> 'Okina

¿Vamos bien? ¿Seguimos?

Os acordáis de los poseídos que querían escribir al revés? Para esos también hay sitio en Unicode!

Unicode tiene un "carácter" especial llamado "RLM" que modifica la posición de los caracteres adyacentes. Dependiendo de dicha posición, los caracteres pueden ser completamente distintos.

Darle la vuelta a una cadena de texto rompe por completo ese orden.

Vamos con el ejemplo!

Ya hemos visto los caracteres que modifican otros caracteres (la "ñ").

Pongamos que tengo los caracteres "A" y "U+0301" ("tilde en el carácter anterior").

El resultado es "Á".

Pero si le damos la vuelta nos queda "́A", porque el "U+301" no actúa al revés

Por cierto! ¿Os había mencionado que U+202e hace que todos los caracteres que le siguen se pinten visualmente en orden inverso y que todo eso se puede usar con RLM?

Share this Scrolly Tale with your friends.

A Scrolly Tale is a new way to read Twitter threads with a more visually immersive experience.
Discover more beautiful Scrolly Tales like this.

Keep scrolling