← Todos los artículos

Normalización Unicode en nombres de archivo: duplicados

Si en una carpeta compartida aparecen dos archivos llamados José - Presupuesto T3.xlsx y uno de ellos no se abre, o la búsqueda de Windows no encuentra un archivo que estás viendo en pantalla, tienes un problema de normalización Unicode en nombres de archivo. Un compañero con Mac guardó un nombre con tilde, eñe, diéresis, sílaba coreana o kana japonés en forma descompuesta (NFD). Windows, la mayoría de servidores Linux y muchos servicios web esperan la forma compuesta (NFC). Los dos nombres se ven idénticos, pero son cadenas de bytes distintas, así que la unidad los guarda uno al lado del otro. La solución es renombrar una sola vez los archivos afectados a NFC y acordar unas cuantas costumbres para que no vuelva a pasar.

Por qué la normalización Unicode en nombres de archivo genera duplicados

Unicode permite escribir el mismo carácter de dos maneras. La é puede ser un único punto de código (U+00E9, la forma compuesta o NFC) o una e normal seguida de un acento agudo combinante (U+0065 U+0301, la forma descompuesta o NFD). Lo mismo ocurre con la ñ de Muñoz (n más una virgulilla combinante), la ü de Agüero, el dakuten del japonés が y cada sílaba coreana, que se descompone en sus jamo individuales (한글 pasa a ser ㅎㅏㄴㄱㅡㄹ en los bytes).

macOS ha guardado históricamente los nombres en NFD, y muchas aplicaciones de Mac y el propio Finder siguen creándolos así. Windows escribe y guarda los nombres en NFC. Cada sistema muestra correctamente la forma del otro, y precisamente por eso nadie se da cuenta hasta que los archivos coinciden en un volumen compartido:

  • Carpetas SMB y NAS (Synology, QNAP, un servidor de archivos Windows, un recurso Samba en Linux). El sistema de archivos guarda los bytes que envía el cliente. Un Mac guarda la versión NFD, un usuario de Windows guarda después la versión NFC, y ya hay dos archivos. Ningún cliente los trata como el mismo nombre.
  • Google Drive, Dropbox, OneDrive. Los clientes de sincronización comparan nombres entre equipos. Según el cliente y la versión, un nombre NFD procedente de un Mac y uno NFC de un PC pueden tratarse como archivos distintos, lo que produce «copias en conflicto» o un duplicado silencioso. Al buscar el nombre en la interfaz web puede que solo aparezca uno de los dos.
  • Slack, Teams, correo electrónico. Un adjunto conserva el nombre que le dio el equipo del remitente. Quien descarga en Windows Currículum - Begoña.pdf enviado desde un Mac recibe un nombre NFD en su disco. Se abre sin problema, pero si luego escribe ese mismo nombre para buscarlo, la búsqueda de Windows no lo encuentra.
  • Scripts, herramientas de compilación y Git. Cualquier cosa que compare cadenas byte a byte ve dos rutas diferentes. Git en un Mac puede marcar un archivo con tilde como eliminado y vuelto a añadir, o no encontrar un archivo que un compañero subió desde Windows.

Lo importante es que nada está dañado. Todos los archivos están íntegros. Solo los nombres discrepan en cómo deletrear las mismas letras.

Cómo saber cuál de las dos copias está en NFD

Antes de renombrar nada, confirma el diagnóstico. A simple vista no hay diferencia, así que hay que mirar los puntos de código.

En Windows (PowerShell)

  1. Abre la carpeta en el Explorador de archivos, haz clic en la barra de direcciones, escribe powershell y pulsa Intro.
  2. Ejecuta:
    Get-ChildItem | ForEach-Object { "$($_.Name) -> $([int[]][char[]]$_.Name -join ' ')" }
    
  3. Compara los dos duplicados. La versión NFC de é aparece como 233; la NFD, como 101 769 (una e más un acento combinante). La ñ en NFC es 241 y en NFD es 110 771. Las sílabas coreanas en NFC aparecen como un solo número entre 44032 y 55203; en NFD, como secuencias de números entre 4352 y 4607.

En un Mac (Terminal)

  1. Abre Terminal y entra en la carpeta con cd (puedes escribir cd , un espacio, y arrastrar la carpeta desde el Finder a la ventana).
  2. Ejecuta:
    python3 -c "import os,unicodedata as u; [print(n, 'NFD' if n!=u.normalize('NFC',n) else 'NFC') for n in os.listdir('.')]"
    
  3. Cada nombre marcado como NFD es uno que Windows y Linux tratarán como un archivo distinto de su gemelo NFC.

Comprobación rápida sin terminal

Copia el nombre del archivo desde Propiedades (Windows) u Obtener información (Mac) y pégalo en el conversor de texto de la aplicación web de FilenameFixer. Si el texto convertido es distinto del que pegaste, el nombre estaba en NFD. La conversión se hace en tu navegador; los archivos y sus nombres no se suben a ningún servidor.

Corregir los archivos que ya tienes

Primero decide cuál de las dos copias es la actual. Abre ambas, revisa las fechas de modificación y quédate con la más reciente o más completa. Después pasa el nombre que sobrevive a NFC.

Opción 1: volver a escribir el nombre en Windows

Haz clic derecho sobre el archivo, elige Cambiar nombre, borra el nombre completo y escríbelo de nuevo con el teclado. Windows produce NFC al teclear, así que un nombre recién escrito siempre está en la forma esperada. Sirve para uno o dos archivos y no requiere herramientas. No funciona si pegas el nombre antiguo, porque al pegar se conservan los bytes NFD.

Opción 2: renombrar por lotes en el Mac antes de que lleguen a la carpeta compartida

Si los archivos se crean en un Mac, corrígelos en origen. Abre la aplicación web de FilenameFixer, arrastra los archivos o una carpeta entera a la página y descárgalos con los nombres convertidos a NFC. Es gratuita, funciona por lotes y, como se ejecuta localmente en el navegador, los archivos no salen de tu equipo. Es la vía práctica cuando un diseñador o un traductor está a punto de soltar cincuenta archivos con tildes, eñes o nombres coreanos en una carpeta compartida.

Opción 3: línea de comandos en un NAS o servidor Linux

Si tienes acceso por shell al NAS o al servidor Samba, convmv normaliza los nombres in situ:

convmv -f utf8 -t utf8 --nfc -r /volume1/compartido/proyecto

Ejecútalo primero sin --notest para ver qué cambiaría y añade --notest para aplicar los cambios. Donde no esté instalado convmv, un bucle corto en Python con unicodedata.normalize('NFC', nombre) y os.rename hace el mismo trabajo.

Opción 4: PowerShell para una carpeta completa en Windows

Get-ChildItem -Recurse | Where-Object { $_.Name -ne $_.Name.Normalize('FormC') } |
  ForEach-Object { Rename-Item $_.FullName $_.Name.Normalize('FormC') }

Si el gemelo NFC ya existe, Rename-Item falla para ese archivo, lo cual es una red de seguridad útil: te obliga a fusionar las dos copias a propósito en lugar de sobrescribir una.

Archivos ZIP compartidos por Slack o correo

Cuando los duplicados llegan dentro de un ZIP comprimido desde un Mac, al descomprimirlo en Windows el problema se reproduce en cada carpeta extraída. En lugar de renombrar después de extraer, puedes pasar el archivo por la herramienta de restauración de nombres en ZIP (archivos de hasta 200 MB), que reescribe las entradas a NFC y te devuelve un ZIP que se extrae sin duplicados.

Evitar la siguiente tanda de duplicados

Renombrar es una limpieza puntual. Estas costumbres mantienen limpia la carpeta compartida a partir de entonces.

  1. Normalizar al subir. Si tu equipo trabaja sobre todo en Google Drive, Slack o un gestor documental en el navegador, los usuarios de Mac pueden instalar la extensión de FilenameFixer para Chrome. Convierte los nombres a NFC automáticamente cada vez que se sube un archivo a través de una web, de modo que el nombre NFD nunca llega al servicio.
  2. Activar core.precomposeUnicode en Git en cada Mac. Ejecuta git config --global core.precomposeUnicode true. Git convertirá las rutas NFD a NFC antes de guardarlas, lo que elimina el vaivén fantasma de borrados y añadidos entre colaboradores de Mac y Windows.
  3. Que una sola persona cree las carpetas compartidas y las plantillas. Los nombres de carpeta se copian mucho más que los de archivo. Si la raíz del proyecto es Evaluación 2026 en NFD, cada subcarpeta que cree un usuario de Mac hereda el problema. Crear la estructura desde un equipo Windows, o normalizarla una vez, evita buena parte de los duplicados futuros.
  4. Preferir ASCII puro en rutas compartidas de larga duración. No siempre es aceptable, sobre todo en equipos coreanos o japoneses, y nadie debería tener que quitarle la tilde o la eñe a su propio nombre. Pero en identificadores internos, por ejemplo 2026-T3-presupuesto en vez de Presupuesto año 2026, prescindir de tildes y eñes no cuesta nada y elimina el problema de raíz.
  5. Reconocer el síntoma, no solo la causa. «La búsqueda no lo encuentra», «la sincronización dice copia en conflicto», «hay dos archivos iguales y uno pesa 0 bytes» son el mismo fallo. Cuando alguien del equipo reporte uno de estos casos, revisa los puntos de código antes de que nadie empiece a borrar archivos.

Nada de esto exige comprar software. Volver a escribir los nombres, PowerShell, convmv y el ajuste de Git vienen incluidos o son gratuitos. FilenameFixer se gana su sitio cuando el volumen es grande, cuando los archivos todavía no han salido del Mac, o cuando prefieres que la conversión ocurra en silencio en el momento de subir en vez de ser una cosa más que recordar.