2 Stimmen

Was ist das? am Anfang der Konsolenausgabe nach dem Lesen einer mit Unicode codierten Textdatei?

Ich habe damit experimentiert, Dateien zu lesen (Textdateien, die in Unicode codiert sind), und aus irgendeinem Grund erhalte ich ein Fragezeichen am Anfang der Ausgabe.

Hier ist der Code.

#include 

#include 
#include 
#include 

int main(void)
{
    HANDLE hFile = CreateFile(L"dog.txt",
                              GENERIC_READ,
                              NULL,
                              NULL,
                              OPEN_EXISTING,
                              FILE_ATTRIBUTE_NORMAL,
                              NULL);

    _setmode(_fileno(stdout), _O_U16TEXT); // Stellt sicher, dass die Konsole die 
                                           // breiten Zeichen korrekt anzeigt. Siehe unten den Link

    LARGE_INTEGER li;
    GetFileSizeEx(hFile,&li); 

    WCHAR* pBuf = new WCHAR[li.QuadPart / sizeof(WCHAR)]; // Allokiert Speicher für die Datei.

    DWORD dwRead = 0;
    BOOL bFinishRead = FALSE;
    do
    {
        bFinishRead = ReadFile(hFile,pBuf,li.QuadPart,&dwRead,NULL);
    } while(!bFinishRead);

    pBuf[li.QuadPart / sizeof(WCHAR)] = 0; // Stellt sicher, dass das Ende der Ausgabe 
                                           // mit einem Nullzeichen terminiert ist.

    std::wcout << pBuf << std::endl;

    std::cin.get();

    return 1;
}

dog.txt

One Two Three

Konsolenausgabe

?One Two Three

Ich habe bereits einen Großteil des Kauderwelschs eliminiert, indem ich sichergestellt habe, dass das Ende der Ausgabe mit einem Nullzeichen terminiert ist, aber das ? am Anfang verwirrt mich.

Was das

_setmode(_fileno(stdout), _O_U16TEXT);

angeht, siehe Ausgabe von Unicode-Zeichenfolgen in Windows-Konsolenanwendung

Hinweis: Mein Code ist auf Windows ausgerichtet, und ich habe vor, das so beizubehalten, wenn möglich.

Vielen Dank.

6voto

ecatmur Punkte 145884

Es handelt sich wahrscheinlich um ein Byte-Reihenfolge-Markierung (BOM). Es ist Standardpraxis, eine BOM am Anfang einer Textdatei in UTF-16 einzufügen, um sicherzustellen, dass sie auf Systemen mit unterschiedlicher Bytereihenfolge korrekt gelesen werden kann (wo die einzelnen Bytes zur Codierung eines UTF-16 Doppelbytes in einer anderen Reihenfolge sind). Sie können sie entfernen, indem Sie überprüfen, ob das erste wchar_t den Codepoint U+FEFF bzw. den Wert 0xfeff hat.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X