txt resueltos programacion por manejo linea libreria leer imprimir ejercicios como buscar binarios archivos archivo c++ windows unicode

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.



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.