Frage

Wie kann ich die Codepage auf UTF-8 in einem C-Windows-Programm eingestellt?

Ich habe einen Dritten Bibliothek, die Anwendungen fopen zum Öffnen von Dateien hat. Ich kann wcstombs verwenden, um meine Unicode-Dateinamen auf die aktuelle Codepage zu konvertieren, aber wenn der Benutzer einen Dateinamen mit einem Zeichen außerhalb der Codepage hat dann diese Pausen.

Im Idealfall würde ich nur _setmbcp nennen (65001), um die Codepage UTF-8 zu setzen, aber die MSDN-Dokumentation für _setmbcp besagt, dass UTF-8 wird nicht unterstützt.

Wie kann ich dieses Problem umgehen?

War es hilfreich?

Lösung

Leider gibt es keine Möglichkeit, die aktuelle Codepage in Windows Unicode zu machen. Die CP_UTF7 und CP_UTF8 Konstanten sind pseudo-Codepages, verwendet nur in MultiByteToWideChar und WideCharToMultiByte Konvertierungsfunktionen, wie Ben erwähnt.

Ihr Problem ist ähnlich wie die der fstream C ++ Klassen. Die fstream Bauer nimmt nur char* Namen, was es unmöglich machte, eine Datei mit einem echten Unicode-Namen zu öffnen. Die einzige Lösung, die durch VC angeboten war ein Hack: separat öffnen Sie die Datei und legen Sie den Griff in die Stream-Objekt. Ich fürchte, dies für Sie keine Option ist, natürlich, da die Dritte Bibliothek wahrscheinlich Griffe nicht akzeptiert.

Die einzige Lösung, die ich denken kann, ist eine temporäre Datei mit einem Nicht-Unicode-Namen zu erstellen, die auf den ursprünglichen fest verbunden ist, und verwendet, die als Parameter.

Andere Tipps

Alle Windows-APIs denken in UTF-16, so dass Sie besser dran mit einem Wrapper um die Bibliothek zu schreiben, die an den Grenzen umwandelt.

Merkwürdigerweise denkt Windows-UTF-8 eine Codepage für die Zwecke der Umwandlung ist, so verwenden Sie die gleichen APIs wie Sie zwischen Codepages konvertieren:

std::wstring Utf8ToUtf16(const char* u8string)
{
    int wcharcount = strlen(u8string);
    wchar_t *tempWstr = new wchar_t[wcharcount];
    MultiByteToWideChar(CP_UTF8, 0, u8string, -1, tempWstr, wcharcount);
    wstring w(tempWstr);
    delete [] tempWstr;
    return w;
}

Und etwas von ähnlicher Form zu konvertieren zurück.

2018 Update: Windows 10 hat die "65001" Codepage weniger "Pseudo" made in zwei Schritten:

  1. conhost Änderungen: Windows Subsystem für Linux verwendet Codepage 65001 für seine Konsolen. Es ist auch möglich chcp 65001 in cmd.exe seit WSL zu laufen. (Es hat dazu geführt, einige ziemlich dumm Python Bugs .)
  2. voll funktions locale: Windows seit Build 17035 ermöglicht Einstellung UTF-8 als locale Codepage . Dieser ist vom April 2018 zu aktualisieren.

Mit Cygwin (die einen UTF-8 locale standardmäßig zur Verfügung stellt), oder schreiben Sie Ihre eigene libc Hack für Windows, die die notwendige UTF-8 funktioniert auf UTF-16 Übersetzungen und hüllt den Nicht-Standard-_wfopen usw. Funktionen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top