¿Interacciones de página de códigos de Windows con nombres de archivo C / C ++ estándar?

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 usado buenas cadenas char * antiguas para representar nombres de archivos, por lo que me sorprendió un poco que alguna vez funcionó, y no hemos hecho nada que yo sepa que debería haber dejado de funcionar. Hice 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.

Me parece que lo que está sucediendo es anteriormente fopen y ofstream :: abrir nombres de archivo aceptados usando esta página de códigos; ahora solo lo hace fopen. Revisé los documentos de fopen de Visual Studio y no veo indicios de lo que hace que una cadena aceptable pase a fopen.

A corto plazo, espero que alguien pueda arrojar algo de luz sobre el tema específico de Windows fopen versus ofstream :: open para mí. A la larga, 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 las aperturas que funcionan se realizan en la configuración regional "C", mientras que las que no funcionan se realizan en la configuración regional predeterminada del cliente. Sin embargo, ese ha sido el caso durante años, y la versión anterior del programa todavía funciona hoy en su sistema, por lo que esto parece una posibilidad remota 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, ¿tal vez un paquete de servicio de VS2005?) Y espero reunir una "mejor práctica" integral para manejar nombres de archivos Unicode en código C ++ portátil.

Respuestas a la pregunta(6)

Su respuesta a la pregunta