← Todos los artículos

Normalización Unicode: Windows no encuentra el archivo

Ves el archivo en el Explorador de archivos. Haces doble clic y se abre sin problema. Pero en cuanto escribes su nombre en un comando, un script, un hipervínculo de Excel, una tarea por lotes o la barra de direcciones, Windows responde "El sistema no puede encontrar el archivo especificado". Cuando el archivo viene de un Mac y su nombre lleva tilde, ñ u otro carácter no ASCII, la causa habitual es la normalización Unicode: macOS suele guardar los nombres de archivo en forma descompuesta (NFD), mientras que todo lo que tecleas en Windows está en forma compuesta (NFC). En pantalla son idénticos, pero son secuencias de caracteres distintas, y Windows no los considera el mismo nombre. La solución es renombrar el archivo para que use la forma compuesta, ya sea con un comando corto de PowerShell o con una herramienta que funciona en el navegador. Este artículo explica las dos vías.

Por qué la normalización Unicode rompe los nombres entre Mac y Windows

Unicode ofrece dos maneras de escribir muchas letras acentuadas. La letra é puede ser un único punto de código (U+00E9, forma "compuesta" o NFC) o una e normal seguida de un acento combinante independiente (U+0065 + U+0301, forma "descompuesta" o NFD). Lo mismo pasa con la ñ: puede ser U+00F1 o una n seguida de una virgulilla combinante (U+006E + U+0303). Las pantallas dibujan las dos formas igual. Los correctores ortográficos aceptan ambas. Una persona no las distingue.

Los sistemas de archivos sí. Windows (NTFS) compara los nombres por su secuencia real de caracteres. Ignora la diferencia entre mayúsculas y minúsculas, pero no trata ñ y n + ◌̃ como iguales. Así que si un archivo llamado Peña_contrato.pdf se creó en un Mac y quedó guardado como Pen + ◌̃a_contrato.pdf, y tú escribes Peña_contrato.pdf con el teclado de Windows, estás pidiendo un nombre que no existe en ese disco.

macOS ha preferido históricamente la forma descompuesta. El antiguo sistema de archivos HFS+ convertía todos los nombres a NFD, y muchas aplicaciones y herramientas de copia de Mac siguen generando nombres en NFD hoy en día. Cuando esos archivos llegan a Windows por un pendrive, una carpeta compartida en red, una carpeta sincronizada en la nube o un correo, el nombre descompuesto viaja con ellos sin cambios.

Qué caracteres se ven afectados:

  • Letras latinas con tilde o diacríticos: José, Núñez, año, Martínez, Müller, Łódź
  • El hangul coreano, que se descompone en letras sueltas (한글 aparece como ㅎㅏㄴㄱㅡㄹ en algunos visores)
  • Los kana japoneses con dakuten o handakuten (が se convierte en か + ゛)
  • El vietnamita, que apila varias marcas sobre una misma vocal

Los nombres en ASCII puro (informe_final_v2.pdf) nunca se ven afectados, y por eso el problema parece aleatorio: solo fallan los archivos de Begoña, de Iñaki o de tu compañero coreano.

Cómo confirmar que el problema es realmente este

Antes de renombrar nada, comprueba que la culpa es de la normalización y no de una errata, un espacio al final o una carpeta equivocada. Tres pruebas rápidas:

1. Prueba con un comodín

Abre la carpeta en PowerShell (clic derecho sobre el fondo de la carpeta y elige Abrir en Terminal o Abrir la ventana de PowerShell aquí) y ejecuta:

Get-ChildItem Pe*.pdf

Si el comodín encuentra el archivo pero escribir el nombre completo no, el nombre contiene caracteres distintos de los que tecleaste. Esa es la firma de la normalización.

2. Compara la longitud

Ejecuta esto en la misma carpeta:

Get-ChildItem | ForEach-Object { "$($_.Name.Length)  $($_.Name)" }

Un nombre como Peña.pdf debería tener 8 caracteres. Si PowerShell dice 9, hay un carácter invisible de más: la virgulilla combinante que sigue a la n normal.

3. Pregúntaselo directamente a PowerShell

Get-ChildItem | Where-Object { $_.Name -ne $_.Name.Normalize('FormC') } | Select-Object Name

Esto lista todos los archivos de la carpeta cuyo nombre no está ya en forma compuesta. Si tu archivo problemático aparece, ya tienes la respuesta.

Otros sitios donde aparece el mismo desajuste en Windows, aunque nunca hayas escrito un comando:

  • Hipervínculos de Excel o Word a archivos locales que funcionaban para el compañero con Mac pero a ti te devuelven "No se puede abrir el archivo especificado".
  • Scripts por lotes, copias de seguridad o herramientas de importación configuradas con una lista de nombres de archivo.
  • "Guardar como" que ofrece crear un segundo Peña.pdf en lugar de preguntar si quieres sobrescribir el existente.
  • Búsquedas en algunas aplicaciones que no devuelven nada con el nombre exacto, mientras que una búsqueda parcial sin la letra acentuada sí lo encuentra.

Solución 1: renombrar los archivos en Windows con PowerShell

Si te manejas con la línea de comandos, Windows ya tiene todo lo necesario. El método Normalize('FormC') de .NET convierte un nombre descompuesto a la forma compuesta, y Rename-Item lo aplica.

  1. Abre la carpeta afectada en PowerShell como se explicó antes.

  2. Previsualiza lo que va a cambiar (todavía no se renombra nada):

    Get-ChildItem -Recurse -File |
      Where-Object { $_.Name -ne $_.Name.Normalize('FormC') } |
      Select-Object FullName
    
  3. Si la lista tiene buena pinta, renombra:

    Get-ChildItem -Recurse -File |
      Where-Object { $_.Name -ne $_.Name.Normalize('FormC') } |
      Rename-Item -NewName { $_.Name.Normalize('FormC') }
    
  4. Repite la comprobación con -ne de la sección anterior. Ahora no debería devolver nada.

Notas y límites:

  • -Recurse recorre también las subcarpetas. Quítalo si solo quieres la carpeta actual. Los nombres de las carpetas también pueden estar descompuestos; ejecuta el comando otra vez sin -File para corregirlos, empezando por las carpetas más profundas.
  • Esto renombra los archivos en tu copia. Si están en una carpeta sincronizada (OneDrive, Dropbox, Google Drive), el cambio se sincronizará de vuelta al Mac. Normalmente es lo que quieres, porque el nombre compuesto funciona en los dos lados.
  • Cualquier hipervínculo o script que hiciera referencia al nombre descompuesto antiguo, copiado y pegado desde el Mac, apuntará ahora a un nombre que ya no existe. En la práctica es raro, porque el problema de fondo es justamente que la gente escribe la forma compuesta.

Solución 2: renombrar en el navegador sin línea de comandos

Si PowerShell no es lo tuyo, o tienes un montón mezclado de archivos y ZIP de varias personas, la aplicación web gratuita FilenameFixer hace la misma conversión arrastrando y soltando.

  1. Abre la aplicación web en Chrome, Edge, Firefox o Safari.
  2. Arrastra los archivos afectados a la página. Puedes soltar un lote entero de una vez.
  3. La herramienta detecta los nombres en forma descompuesta y muestra la versión compuesta (NFC) que va a aplicar.
  4. Descarga los archivos renombrados y sustituye los originales.

Algunos detalles que conviene saber:

  • Los archivos y sus nombres se procesan localmente en tu navegador. No se suben a ningún servidor, así que un contrato confidencial llamado Peña_contrato.pdf no sale de tu equipo.
  • Si los nombres rotos están dentro de un ZIP que te ha enviado alguien con Mac, la herramienta de restauración de ZIP reescribe los nombres dentro del archivo comprimido (hasta 200 MB) para que puedas extraerlo con normalidad en Windows.
  • También hay un cuadro para texto pegado. Si un compañero te mandó una lista de nombres de archivo en un correo o una hoja de cálculo y tus fórmulas de búsqueda no consiguen emparejarlos con los archivos del disco, pega la lista y copia la versión normalizada.

FilenameFixer no hace nada que PowerShell no pueda hacer. Simplemente evita tener que saber qué comando ejecutar, y además maneja archivos comprimidos, cosa que el método con Rename-Item de arriba no cubre.

Cómo evitar que vuelva a pasar

Renombrar arregla los archivos de hoy. Para evitar la siguiente tanda:

  • Pide a la parte del Mac que comprima teniendo en cuenta la normalización, o que envíe a través de un formulario web. Muchas rutas de subida web normalizan los nombres al recibirlos, aunque no todas.
  • Usa la extensión de Chrome si subes archivos creados en Mac a aplicaciones web. La extensión de FilenameFixer para Chrome convierte los nombres a NFC automáticamente cuando eliges archivos en un cuadro de subida, de modo que el gestor documental de la intranet o la herramienta de tickets recibe el nombre compuesto desde el principio.
  • Mantén los archivos compartidos de un proyecto con nombres ASCII siempre que puedas. pena_contrato.pdf o jose_contrato.pdf funcionan en todas partes sin rozar este problema. Es menos bonito, pero para cualquier cosa referenciada por un script, un hipervínculo o una lista de importación, es la opción más segura.
  • Normaliza en el código. Si escribes software que lee nombres de archivo del disco y los compara con lo que escribe el usuario, normaliza los dos lados a NFC antes de comparar. La mayoría de lenguajes lo resuelven con una sola llamada (.Normalize('FormC') en .NET, unicodedata.normalize('NFC', s) en Python, str.normalize('NFC') en JavaScript).

Nada de esto es un fallo de Windows ni de macOS. Los dos sistemas guardan exactamente los bytes que recibieron. El desajuste solo existe porque dos grafías válidas de la misma letra han coincidido en un mismo disco, y la forma más rápida de zanjar la discusión es elegir la forma compuesta y renombrar.