2

私はファイル(Unicodeでエンコードされたテキストファイル)の読み取りをいじくり回してきましたが、何らかの理由で出力の最初に疑問符が表示されます。

これがコードです。

#include <iostream>

#include <Windows.h>
#include <fcntl.h>
#include <io.h>

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

    _setmode(_fileno(stdout), _O_U16TEXT); //Making sure the console will 
                                           //display the  wide characters 
                                           //correctly. See below for link

    LARGE_INTEGER li;
    GetFileSizeEx(hFile,&li); 

    WCHAR* pBuf = new WCHAR[li.QuadPart / sizeof(WCHAR)]; //Allocating space for 
                                                          //the file.

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

    pBuf[li.QuadPart / sizeof(WCHAR)] = 0; //Making sure the end of the output 
                                           //is null-terminated.

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

    std::cin.get();

    return 1;
}

dog.txt

One Two Three

コンソール出力

?One Two Three

出力の終わりがnullで終了することを確認することで、すでに多くのぎこちなさを排除しましたが、?最初は私を困惑させます。

_setmode(_fileno(stdout), _O_U16TEXT);

WindowsコンソールアプリでのUnicode文字列の出力を参照してください

注:私のコードはWindows指向であり、可能であればそのように維持するつもりです。

ありがとう。

4

1 に答える 1

6

おそらくバイト順マーク(BOM)です。UTF-16のテキストファイルの先頭にBOMを挿入して、異なるエンディアンシステム(UTF-16の2バイト値をエンコードする個々のバイトの順序が異なる)で正しく読み取れるようにするのが標準的な方法です。 。wchar_t最初のものがコードポイントであるかどうか、U+FEFFつまり値があるかどうかを確認することで、それを取り除くことができます0xfeff

于 2012-07-02T17:20:51.770 に答える