Un cliente se queja de que nuestro código solía escribir archivos con caracteres japoneses en el nombre del archivo pero ya no funciona en todos los casos. Siempre hemos utilizado buenas cadenas de caracteres * para representar nombres de archivos, por lo que me sorprendió un poco que alguna vez funcionó, y no hemos hecho nada de lo que sea consciente que debería haber hecho que dejara de funcionar. Les pedí que me enviaran un archivo con un nombre de archivo incrustado exportado desde nuestro software, y parece que las cadenas usan caracteres hexadecimales 82 y 83 como el primer carácter de una secuencia de doble byte para representar los caracteres japoneses. Buscar en línea me lleva a creer que esto es probablemente SHIFT_JIS y/o la página de códigos de Windows 932.Interacciones de página de códigos de Windows con nombres de archivo C/C++ estándar?
Me parece que lo que está sucediendo anteriormente es tanto fopen como ofstream :: abre los nombres de archivo aceptados utilizando esta página de códigos; ahora solo fopen lo hace. He revisado los documentos forales de Visual Studio y no veo ninguna pista sobre qué hace que una cadena aceptable pase para abrirse.
En el corto plazo, espero que alguien pueda arrojar algo de luz sobre el problema específico de Windows fopen versus ofstream :: open para mí. A la larga, realmente me gustaría saber la forma aceptada de abrir nombres de archivo Unicode (y otros?) En C++, en Windows, Linux y OS X.
Editado para agregar: creo que abre eso el trabajo se realiza en la configuración regional "C", mientras que los que no funcionan se realizan en la configuración regional predeterminada del cliente. Sin embargo, ese ha sido el caso desde hace años, y la versión anterior del programa todavía funciona hoy en su sistema, por lo que parece una apuesta arriesgada para explicar el problema que estamos viendo.
Actualización: Envié un pequeño programa de prueba al cliente. Se ha verificado que fopen funciona bien con el nombre de archivo SHIFT_JIS, y std :: ofstream no. Esto está en Visual Studio 2005 y sucedió independientemente de si utilicé la configuración regional predeterminada o la configuración regional "C".
Todavía estoy interesado si alguien tiene una explicación para este comportamiento (y por qué cambió misteriosamente, ¿quizás un Service Pack de VS2005?) Y esperando reunir un conjunto completo de "mejores prácticas" para manejar nombres de archivo Unicode en portable Código C++
Tal vez podría darle el período de tiempo cuando esto ocurrió. Windows ha cambiado mucho a lo largo de los años. –
Buen punto. El cambio ocurrió en el último año. – Sol