2010-02-23 11 views
10

Necesito abrir un archivo como std :: fstream (o en realidad cualquier otro std :: ostream) cuando el nombre de archivo es el nombre de archivo "Unicode".Abrir fstream con archivo con nombre de archivo Unicode en Windows usando el compilador no MSVC

Bajo MSVC tengo no estándar extensión std::fstream::open(wchar_t const *,...)? ¿Qué puedo hacer con otros compiladores como GCC (el más importante) y probablemente el compilador de Borland?

Sé que CRTL ofrece _wfopen pero da C FILE * interfaz en lugar de io-corrientes, tal vez hay una forma no estándar para crear io-stream de FILE *? ¿Hay alguna boost::ifstream con extensión similar a MSVC para Windows?

+0

No puede. En Mac OS X se decidió que las api del archivo POSIX, y por lo tanto std :: fstream, tomarían utf-8. En entornos donde no hay extensiones específicas de plataforma (como gcc y bc en Windows (en realidad, pueden tener sus propias extensiones, pero eso estaría fuera del estándar POSIX)) las funciones de tiempo de ejecución de c & C++ no se pueden esperar confiablemente acceder al sistema de archivos dado archivos con caracteres no ascii en su nombre. –

+0

@Chris No tengo problemas con la biblioteca que admite UTF-8; es perfecta para mí. El problema de que Windows no es compatible con UTF-8 – Artyom

+0

es una solución provisional para MinGW en http://stackoverflow.com/questions/6524821/opening-stream-via-function – marcin

Respuesta

3

Actualmente no hay una solución fácil.

Debe crear su propio búfer de secuencia que utiliza _wfopen debajo del capó. Puede utilizar para esto, por ejemplo, boost::iostream

-3

convertir el nombre de archivo Unicode a un char* cadena usando algo así como wcstombs() o WideCharToMultiByte() (que le da mucho más control sobre las páginas de códigos involucrados).

Luego use el nombre del archivo convertido para abrir el archivo.

+4

El nombre de archivo incluye caracteres Unicode que pueden no estar representados en la versión actual. la página de códigos locale (es decir, los caracteres hebreos no se pueden representar en la configuración regional de Latin1 8 bits), también Windows no admite páginas de códigos UTF-8. Entonces, no, esto no funciona. – Artyom

7

Desafortunadamente, no hay una forma estándar de hacerlo, aunque C++ 0x (1x?) Promete hacer eso. Hasta entonces, asumió correctamente que se puede encontrar una solución en Boost; sin embargo, la biblioteca que está buscando es Boost.Filesystem.

Boost.Filesystem internamente utiliza cadenas anchas por defecto para su sistema de ruta universal, por lo que no hay problemas de unicode en este sentido.

+0

¿Tiene una referencia para C++ 0X? Recuerdo discusiones pero no conclusiones y no encontré nada en el último borrador. – AProgrammer

+4

El problema es que 'boost :: filesystem' no admite wpath en MinGW/GCC porque la configuración boost define' BOOST_NO_STD_WSTRING' por algún motivo (incluso las cadenas amplias funcionan bastante bien en mingw) – Artyom

+0

He buscado un poco más y encontré esto : http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#454, aparentemente no hay solución antes de la biblioteca TR2. – AProgrammer

Cuestiones relacionadas