c++ - resueltos - ¿Cómo abrir un std:: fstream(ofstream o ifstream) con un nombre de archivo unicode?
manejo de archivos en c++ fstream (4)
Eche un vistazo a Boost.Nowide :
#include <boost/nowide/fstream.hpp>
#include <boost/nowide/cout.hpp>
using boost::nowide::ifstream;
using boost::nowide::cout;
// #include <fstream>
// #include <iostream>
// using std::ifstream;
// using std::cout;
#include <string>
int main() {
ifstream f("UTF-8 (e.g. ß).txt");
std::string line;
std::getline(f, line);
cout << "UTF-8 content: " << line;
}
No imaginaría algo tan básico como abrir un archivo usando la biblioteca estándar de C ++ para una aplicación de Windows fue complicado ... pero parece serlo. Por Unicode aquí me refiero a UTF-8, pero puedo convertir a UTF-16 o lo que sea, el punto es obtener una instancia ofstream a partir de un nombre de archivo Unicode. Antes de hackear mi propia solución, ¿hay una ruta preferida aquí? Especialmente uno multiplataforma?
La biblioteca estándar de C ++ no es compatible con Unicode. char
y wchar_t
no son obligatorios para ser codificaciones Unicode.
En Windows, wchar_t
es UTF-16, pero no hay soporte directo para los nombres de archivo UTF-8 en la biblioteca estándar (el tipo de datos char
no es Unicode en Windows)
Con MSVC (y por lo tanto Microsoft STL), se proporciona un constructor para filestreams que toma un nombre de archivo const wchar_t*
, lo que le permite crear la secuencia como:
wchar_t const name[] = L"filename.txt";
std::fstream file(name);
Sin embargo, esta sobrecarga no está especificada por el estándar C ++ 11 (solo garantiza la presencia de la versión basada en caracteres). Tampoco está presente en implementaciones alternativas de STL como libstdc ++ de GCC para MinGW (-w64), a partir de la versión g ++ 4.8.x.
Tenga en cuenta que al igual que char
en Windows no es UTF8, en otros sistemas wchar_t
, wchar_t
puede no ser UTF16. Entonces, en general, esto no es portátil. Abrir una secuencia con un wchar_t
archivo wchar_t
no se define de acuerdo con el estándar, y especificar el nombre de archivo en char
s puede ser difícil porque la codificación utilizada por char varía entre los OS''es.
Las versiones actuales de Visual C ++ std :: basic_fstream tienen un método open()
que toma un wchar_t * de acuerdo con http://msdn.microsoft.com/en-us/library/4dx08bh4.aspx .
Utilice std::wofstream
, std::wifstream
y std::wfstream
. Aceptan un nombre de archivo Unicode. El nombre de archivo debe ser wstring
, array de wchar_t
s, o tiene que tener _T()
macro o prefijo L
antes del texto.