0

EditControlでANSIとUnicodeを開いて表示できるユニバーサルテキストエディタを作成しようとしています。ReadFile()テキストがANSIであると判断した場合、繰り返し電話をかける必要がありますか?このタスクを実行する方法を理解できません。以下の私の試みは機能しません、それは「?」を表示します EditControlの文字。

LARGE_INTEGER fSize;
        GetFileSizeEx(hFile,&fSize);

        int bufferLen = fSize.QuadPart/sizeof(TCHAR)+1;
        TCHAR* buffer = new TCHAR[bufferLen];       
        buffer[0] = _T('\0');

        DWORD wasRead = 0;
        ReadFile(hFile,buffer,fSize.QuadPart,&wasRead,NULL);        
        buffer[wasRead/sizeof(TCHAR)] = _T('\0');

        if(!IsTextUnicode(buffer,bufferLen,NULL))
        {                       
            CHAR* ansiBuffer = new CHAR[bufferLen];
            ansiBuffer[0] = '\0';
            WideCharToMultiByte(CP_ACP,0,buffer,bufferLen,ansiBuffer,bufferLen,NULL,NULL);
            SetWindowTextA(edit,ansiBuffer);
            delete[]ansiBuffer;
        }
        else
            SetWindowText(edit,buffer);

        CloseHandle(hFile);
        delete[]buffer;
4

1 に答える 1

2

バッファ長のエラーと奇妙な点がいくつかありますが、ここに大きな問題があります。WideCharToMultiByte間違って電話します。これは、UTF-16でエンコードされたテキストを入力として受け取ることを目的としています。ただし、IsTextUnicodefalseが返される場合は、バッファがUTF-16でエンコードされていないことを意味します。

基本的に必要なものは次のとおりです。

if(!IsTextUnicode(buffer,bufferLen*sizeof(TCHAR),NULL))
    SetWindowTextA(edit,(char*)buffer);

長さパラメータをに固定していることに注意してくださいIsTextUnicode

価値があるので、私はのバッファに読み込んだと思いますchar。これにより、の必要がなくなりsizeof(TCHAR)ます。実際、私はTCHAR完全に使用をやめます。このプログラムは、ずっとUnicodeである必要があります。これTCHARは、WindowsのNTと9xの両方のバリアント用にコンパイルするときに使用するものです。私が想像するように、あなたはもう9倍のコンパイルをしていません。

だから私はおそらくそれを次のようにコーディングするでしょう:

char* buffer = new char[filesize+2];//+2 for UTF-16 null terminator
DWORD wasRead = 0;
ReadFile(hFile, buffer, filesize, &wasRead, NULL);        
//add error checking for ReadFile, including that wasRead == filesize
buffer[filesize] = '\0';
buffer[filesize+1] = '\0';
if (IsTextUnicode(buffer, filesize, NULL))
    SetWindowText(edit, (wchar_t*)buffer);
else
    SetWindowTextA(edit, buffer);
delete[] buffer;

このコードは、UTF-8でエンコードされたテキストを受信する可能性を考慮していないことにも注意してください。それを処理したい場合は、charバッファを取得し、をMultiByteToWideChar使用してに送信する必要がありますCP_UTF8

于 2012-09-26T17:41:39.687 に答える