Atlasingeniería

Algoritmos y programaciónManejo de datosTema 2

Cadenas de texto y Unicode

Una cadena es una secuencia codificada, no una lista simple de letras. Longitud, posición y corte dependen de distinguir bytes, unidades de código y caracteres visibles.

Para este tema conviene tener claro:Arreglos, listas y matrices

¿Cuántos caracteres tiene un emoji? La respuesta puede ser uno, dos o varios según qué estemos contando. El texto parece simple hasta que confundimos bytes, unidades de código, puntos Unicode y símbolos que una persona ve en pantalla.

De símbolos a puntos de código a bytes

Unicode asigna puntos de código a símbolos; una codificación como UTF-8 los convierte en bytes. Algunos lenguajes exponen posiciones como bytes y otros como unidades de longitud fija. Ninguna de esas posiciones garantiza coincidir con caracteres visibles.

Una letra acentuada puede representarse como un punto precompuesto o como letra más marca. Un emoji familiar puede combinar varios puntos mediante modificadores y uniones.

La palabra «café» escrita con la é precompuesta: cuatro posiciones, cuatro símbolos visibles.

1 / 4
Las dos cadenas se ven igual en pantalla y no son iguales para el programa. Por eso comparar texto empieza por decidir qué significa «igual» en la aplicación.

Antes de seguir, predecí

«café» escrito con la é precompuesta y «café» con e más acento combinante. ¿Qué devuelve la comparación con igualdad?

Concatenar, buscar y cortar tienen precio

Concatenar, buscar y cortar tienen costos que dependen de la representación. Si las cadenas son inmutables, concatenar repetidamente dentro de un ciclo puede copiar todo el prefijo una y otra vez y terminar en costo cuadrático.

Para construir texto grande conviene acumular fragmentos y unir una vez, o usar un constructor especializado. La claridad de result += part no garantiza eficiencia para todos los runtimes.

Cortar por posición rompe cosas

Cortar por posición interna puede separar una pareja sustituta o una secuencia combinada. Si la operación visible es “tomar los primeros diez caracteres”, necesitamos segmentación por grafemas, no un slice arbitrario.

Si la operación es un protocolo, quizá sí importen bytes exactos. La unidad correcta depende del problema: almacenamiento, comparación lingüística y edición visual piden abstracciones distintas.

Escena 1 — Cada más arma un texto nuevo

paso a paso

Cargando la escena…

El texto no se modifica: se crea otro y el nombre pasa a apuntar ahí. Por eso los caracteres copiados crecen mucho más rápido que el resultado, y por eso pegar dentro de un ciclo es cuadrático.

Comparar texto no es comparar números

Comparar texto tampoco es sólo comparar números internos. Mayúsculas, normalización y reglas de idioma afectan búsquedas y orden. Un identificador técnico puede exigir igualdad exacta; un nombre visible puede necesitar comparación localizada.

Normalizar sin definir el dominio puede alterar datos significativos. Primero decidí qué significa “igual” para la aplicación y luego elegí la operación correspondiente.

Lo que pasa al comparar y al cortar

const a = 'café';                 // é como un solo punto de código
const b = 'cafe\u0301';           // e + acento combinante

a === b;                          // false: son bytes distintos
a.length;                         // 4
b.length;                         // 5
a.normalize('NFC') === b.normalize('NFC'); // true: ahora sí

'Straße'.toUpperCase();           // 'STRASSE': una letra se convirtió en dos
'İ'.toLowerCase().length;         // en turco, el mapeo no es uno a uno

const emoji = '👨‍👩‍👧';
emoji.length;                     // 8: son varios puntos unidos
[...emoji].length;                // 5: iterar da puntos de código, no símbolos
emoji.slice(0, 2);                // corta al medio de la familia

Las tres partes muestran lo mismo desde ángulos distintos: la longitud de una cadena no es la cantidad de símbolos que se ven, cortar por posición puede partir una secuencia, y convertir mayúsculas depende del idioma.

Comparar, ordenar y guardar texto

ParaUsarPor qué no lo obvio
Comparar si son el mismo textonormalizar y después ===los mismos símbolos pueden ser bytes distintos
Comparar sin distinguir mayúsculaslocaleCompare con sensitivitytoLowerCase depende del idioma
Ordenar una lista para mostrarIntl.Collatorel orden de los bytes no es el alfabético
Buscar un usuario por nombreuna columna normalizada apartenormalizar en cada consulta impide usar el índice
Guardar en la baseUTF-8, y declararlola codificación por defecto puede no serlo
La tercera fila sorprende siempre: ordenar por bytes pone «Zapata» antes que «ángel», y en castellano eso está mal. El orden alfabético es una regla del idioma, no de los números.

Cierre

Una cadena tiene varias capas: bytes, codificación, puntos de código y grafemas. Elegir la capa correcta evita texto corrupto y conteos falsos. El usuario ve símbolos; el programa debe declarar qué unidad está procesando.

Autoevaluación

¿Lo entendiste?

La longitud que devuelve el lenguaje para una cadena con emojis, ¿qué está contando?
Concatenar dentro de un ciclo con result += part, ¿qué riesgo tiene?
«Mostrar los primeros diez caracteres». ¿Qué operación corresponde?
Antes de normalizar texto para comparar, ¿qué hay que decidir?