2016-07-18 18 views
3

Ich habe Dutzende von Fragen zu diesem Thema gesehen, aber keine von ihnen hat mir geholfen.C++ schreibe keinen englischen Text in eine Datei

Angenommen, ich habe eine Zeichenfolge "հայեր" oder "русский" (wchat_t*, wstring, LPTSTR, oder etwas anderes).

Jetzt möchte ich eine Ausgabedatei "res.txt" erstellen und die Zeichenfolge abschreiben. Während ich versuchte, es zu schreiben, schrieb ich nichts, '?' und einige willkürliche Zahlen in der Datei.

Kann mir jemand einen Weg vorschlagen, wie man nicht-englische Strings behält und wie man sie richtig in eine Datei schreibt?

Danke.

+1

Wie haben Sie die Datei geschrieben? Wenn Sie 'wchar_t *' oder 'std :: wstring' verwenden, sollten Sie' std :: wofstream' verwenden. – NathanOliver

+0

habe ich versucht aber keine der Kombinationen hilft. Also schlagen Sie vor, es als Wstring zu behalten und wostream zu verwenden? Wenn ja, dann schreibt es nichts in die Datei – mbaros

+0

Wie ist Ihre Quelldatei kodiert? utf8, Latein-1, ...? – Jarod42

Antwort

0

Das funktionierte für mich gut.

#include <fstream> 
    #include <locale> 
    #include <codecvt> 

    const locale utf8_locale = locale(locale(), new codecvt_utf8<wchar_t>()); 
    wofstream file(url); 
    file.imbue(utf8_locale); 
    file << L"իմբյու" << endl; 
0

Sie müssen Unicode für die Codierung verwenden.

+0

Wie? Kannst du bitte ein vollständiges Beispiel mitbringen? – mbaros

+0

Sie müssen Escapes in Form von "\ uXXXX" verwenden (Xs steht für Dezimalzahlen) - auf diese Weise können Sie Unicode-Symbole in Ihrem Code verwenden. Leider ist es ziemlich unpraktisch, wenn man den ganzen Text in diesen Symbolen hat. C++ hat einen ziemlich schlechten Gebrauch von Unicode im Allgemeinen ... (wenn Ihr ganzes Programm auf Unicode basiert, würde ich vielleicht vorschlagen, eine andere Sprache zu verwenden) – Sia

+0

wow ... das ist eine ziemlich starke Aussage. Ich benutze C++ oft, und ich habe keine Probleme mit Unicode. Aber es läuft darauf hinaus, wie Sie es verwenden und was Sie brauchen. Da ich in der Linux-Welt lebe, sind die meisten Strings/Texte UTF-8-kodiert, was sehr gut mit C++ funktioniert.In Windows haben sie sich für UTF-16 entschieden, was in C++ Quellen etwas trickreicher ist (aber mit guter IDE und Speicher, um jedes String-Literal "breit" zu markieren, sollte es in Ordnung sein), aber IMO funktioniert ganz OK, weit entfernt "schlechte Verwendung". Außerdem müssen Sie nicht explizit mit \ uXXXX arbeiten, wenn Sie gut planen und wissen, was Sie tun. – Ped7g

2

Bevor Sie sogar die Aufgabe der Erstellung von Textdateien, die nicht-lateinische Buchstaben beginnen können, müssen Sie bestimmen, welche Codierung für Ihren Ort verwendet werden.

Wenn Ihr Gebietsschema beispielsweise die Codierung UTF-8 verwendet, muss die Zeichenfolge "русский" vollständig anders codiert werden, als wenn Ihr Gebietsschema KOI8-R lautet.

Die Zeichenfolge "русский" in UTF-8 wird durch die Oktetts (Bytes) dargestellt: d1 80 d1 83 d1 81 d1 81 d0 ba d0 b8 d0 b9. Für ein Gebietsschema KOI8-R sind die entsprechenden Oktetts d2 d5 d3 d3 cb c9 ca.

Internationalisierung ist schwer.

In den meisten Fällen werden Sie möglicherweise in der Lage der C++ Bibliothek Breitzeichen mit Unicode-Streams zu verwenden:

#include <iostream> 
#include <locale> 

int main() 
{ 
    std::locale::global(std::locale("")); 
    std::wcout << L"\u0440\u0443\u0441\u0441\u043a\u0438\u0439" << std::endl; 
    return 0; 
} 

Hoffentlich wird die Ausgabe von dieser seinen „русский“, auf Ihrer Plattform. Vorausgesetzt, dies funktioniert, könnte dies der Pfad des geringsten Widerstands sein, aber Sie müssen die Unicode-Werte für jedes Zeichen nachschlagen.

Es gibt auch Unterstützung für UTF-8 im neuen C++ - Standard, aber die Antwort hier ist für Sie, um etwas Zeit zu verbringen, sich auf die allgemeinen Konzepte von Gebietsschema, Unicode und Internationalisierung zu erziehen. Es wird schwierig sein, dies richtig zu tun, ohne ein vollständiges Verständnis davon zu haben, wie all diese Dinge funktionieren.

+0

es gibt nichts weder auf der Konsole noch in te-Datei. – mbaros

+0

Dann unterstützt Ihr C++ - Compiler oder -Betriebssystem nicht einmal die Mindestanforderungen des aktuellen C++ - Standards. oder Ihr aktuelles Gebietsschema enthält nicht das kyrillische Alphabet. Es kann nichts weiter bestimmt werden, ohne den Compiler und das Gebietsschema der Systemumgebung zu kennen. –