studio - Forma multiplataforma de escribir un std:: wstring en un archivo en C++
visual studio installer (2)
Puede usar el siguiente código cortado. La diferencia con su código es que aquí usé std :: codecvt_utf8 en lugar de boost :: locale ....
#include <locale>
#include <codecvt>
----
std::wstring s = L"输入法.";
const std::locale utf8_locale = std::locale(std::locale(), new std::codecvt_utf8<wchar_t>());
myfile.open("E:/testFile.txt");
if (myfile.is_open())
{
myfile.imbue(utf8_locale);
myfile << s << endl;
myfile.close();
}
else
{
std::cout << "Unable to open file";
}
He estado luchando mucho para hacer algo que parece simple: escribir los contenidos en un std :: wstring en el disco. Supongamos que tengo la siguiente cadena que quiero escribir en un archivo de texto sin formato:
std::wstring s = L"输入法."; // random characters pulled from baidu.cn
- Utilizando
std::utf8_codecvt
o boost local
Aquí está el código que utilicé:
std::wofstream out(destination.wstring(), std::ios_base::out | std::ios_base::app);
const std::locale utf8_locale = std::locale(std::locale(), new boost::locale::utf8_codecvt<wchar_t>());
out.imbue(utf8_locale);
// Verify that the file opened correctly
out << s << std::endl;
Esto funciona bien en Windows, pero lamentablemente lo utf8_codecvt
en Linux: utf8_codecvt
aún no está disponible en compiladores provistos de las distribuciones habituales, y Boost: Locale solo se ha incluido en Boost 1.60.0, que también es una versión que también es reciente para los repositorios de la distribución Sin establecer la configuración regional, no se escribe nada en el archivo (en ambos sistemas).
- Con fwrite
Siguiente intento:
FILE* out = fopen("test.txt", "a+,ccs=UTF-8");
fwrite(s.c_str(), wcslen(s.c_str()) * sizeof(wchar_t), 1, out);
fclose(out);
Esto funciona en Windows, pero no escribe nada en el archivo en Linux. También intenté abrir el archivo en modo binario, pero eso no cambió nada. Si no se establece la parte de ccs
basura indescifrable se escribirá en el archivo.
Obviamente me falta algo aquí: ¿cuál es la forma correcta de escribir esa cadena en un archivo?
Los tipos de flujo siempre producen salida ASCII incluso cuando los datos de entrada son Unicode. Como primera, debe configurar la configuración regional para su salida. Solo después, debe escribir cualquier cosa en el archivo. Creo que este ejemplo debería ayudarte. Lo estaba ejecutando en Ubuntu.
#include <cstdio>
#include <cwchar>
#include <string>
#include <locale>
void write_string(FILE *fd, std::wstring str)
{
std::fputws(str.c_str(), fd);
}
int main()
{
setlocale(0, "");
FILE *fd = std::fopen("./test.txt", "w");
write_string(fd, L"输入法.");
std::fclose(fd);
return 0;
}