Tengo algunos archivos con nombres rusos (cirílicos).
Cuando los abro en el Explorador de Windows, los nombres se muestran correctamente.
Cuando los enumero en el shell de comandos (cmd), se muestran como "??????" personaje.
¿Hay alguna manera de saber qué codificación se utiliza en los nombres de los archivos?
¿Una de las páginas de códigos? (Probé las páginas de códigos cirílicos comunes 866 y 1251 usando chcp
el comando sin suerte). ¿Unicode (probé 65001 sin suerte)? ¿Algo más?
No me importa particularmente el método de respuesta (todo lo siguiente es aceptable: programa gratuito, script Perl, script Powershell, página web que me obliga a cargar el archivo).
Sistema: Windows XP SP3.
Respuesta1
La codificación del nombre de archivo está definida por el sistema de archivos. NTFS utiliza UTF-16. Pero no importa.
Cuando estás dir
en la línea de comando, no solo copia bytes a ciegas. Primero debe llamar a la función apropiada del sistema operativo para enumerar el directorio y luego imprimir los detalles del archivo recibido en la consola.
Cuando cmd
llama a la función del sistema para recuperar el listado del directorio, ya espera que se devuelva en la codificación preferida (que no es necesariamente la codificación que usted elija; hablaremos de esto más adelante). No importa qué codificación se use internamente en el FS, porque el sistema operativo proporciona una capa de abstracción adicional para simplificar las cosas. FS puede usar cualquier codificación que pueda imaginar, pero siempre que el sistema operativo lo admita, cmd
recibirá nombres de archivos en su codificación preferida, no en la codificación de FS.
La "codificación preferida" que he mencionado es ANSI con página de códigos aplicada o Unicode. ANSI se usaba como codificación predeterminada antes de Windows 2000. Windows 2000 y versiones más recientes usan Unicode de forma predeterminada, pero aún pueden ejecutar programas ANSI.
Para los programas Unicode, la página de códigos se ignora por completo y chcp
no tiene ningún efecto. Se utiliza sólo para programas ANSI más antiguos que dependen de la configuración de la página de códigos adecuada. Ya no importa para Unicode, porque está bien definido y admite todo lo que cualquier programa razonable podría generar.
cmd
admite Unicode, por lo que recibirá nombres de archivos que ya están en Unicode.
Como ya habrás descubierto, la culpable fue la fuente predeterminada. Este problema se menciona enPágina de Technet en chcp:
Sólo la página de códigos del fabricante del equipo original (OEM) instalada con Windows XP aparece correctamente en una ventana del símbolo del sistema que utiliza fuentes Raster. Otras páginas de códigos aparecen correctamente en el modo de pantalla completa o en ventanas de símbolo del sistema que utilizan fuentes TrueType.