Multiplattform-Möglichkeit zum Schreiben eines std:: wstring in eine Datei in C++




encoding character-encoding (2)

Ich habe viel darum gekämpft, etwas zu tun, was einfach aussieht: den Inhalt in ein std :: wstring auf die Festplatte schreiben. Angenommen, ich habe die folgende Zeichenfolge, die ich in eine Nur-Text-Datei schreiben möchte:

std::wstring s = L"输入法."; // random characters pulled from baidu.cn
  1. Verwenden von std::utf8_codecvt oder boost locale

Hier ist der Code, den ich benutzt habe:

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;

Das funktioniert unter Windows gut, aber leider habe ich es unter Linux kompiliert: utf8_codecvt ist noch nicht auf Compilern mit den üblichen Distributionen verfügbar, und Boost: Locale wurde nur in Boost 1.60.0 aufgenommen, was wiederum eine Version ist Zuletzt für die Repositories der Distribution. Ohne das Gebietsschema zu setzen, wird nichts in die Datei geschrieben (auf beiden Systemen).

  1. Mit fwrite

Nächster Versuch:

FILE* out = fopen("test.txt", "a+,ccs=UTF-8");
fwrite(s.c_str(), wcslen(s.c_str()) * sizeof(wchar_t), 1, out);
fclose(out);

Dies funktioniert unter Windows, schreibt aber nichts in die Datei unter Linux. Ich habe auch versucht, die Datei im Binärmodus zu öffnen, aber das hat nichts geändert. ccs der ccs Teil nicht gesetzt, wird nicht entzifferbarer Müll in die Datei geschrieben.

Mir fehlt hier offensichtlich etwas: Was ist der richtige Weg, um diese Zeichenfolge in eine Datei zu schreiben?


Sie können den nächsten ausgeschnittenen Code verwenden. Der Unterschied zu deinem Code ist, dass ich hier std :: codecvt_utf8 anstelle von boost :: locale verwendet habe ....

#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";
}

Die Stream-Typen erzeugen immer ASCII-Ausgaben, auch wenn die Eingabedaten Unicode sind. Als erstes sollten Sie das Gebietsschema für Ihre Ausgabe einrichten. Erst später sollten Sie alles in die Datei schreiben. Ich denke, dieses Beispiel sollte dir helfen. Ich habe es auf Ubuntu ausgeführt.

#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;
}




character-encoding