5

私のソフトウェアの要件は、エクスポートされたデータを含むファイルのエンコーディングが UTF8 であることです。しかし、データをファイルに書き込むとき、エンコーディングは常に ANSI です。(これを確認するには、Notepad ++を使用します。)

私が現在行っているのは、ファイルを読み取り、UTF8 に変換し、テキストを新しいファイルに書き込むことによって、ファイルを手動で変換しようとしていることです。

lineです です ですstd::string
inputFileですstd::ifstream
pOutputFileですFILE*

// ...

if( inputFile.is_open() )
{
    while( inputFile.good() )
    {
        getline(inputFile,line);

        //1
        DWORD dwCount = MultiByteToWideChar( CP_ACP, 0, line.c_str(), -1, NULL, 0 );
        wchar_t *pwcharText;
        pwcharText = new wchar_t[ dwCount];

        //2
        MultiByteToWideChar( CP_ACP, 0, line.c_str(), -1, pwcharText, dwCount );

        //3
        dwCount = WideCharToMultiByte( CP_UTF8, 0, pwcharText, -1, NULL, 0, NULL, NULL );
        char *pText;
        pText = new char[ dwCount ];

        //4
        WideCharToMultiByte( CP_UTF8, 0, pwcharText, -1, pText, dwCount, NULL, NULL );

        fprintf(pOutputFile,pText);
        fprintf(pOutputFile,"\n");

        delete[] pwcharText;
        delete[] pText;
    }
}

// ...

残念ながら、エンコーディングはまだ ANSI です。解決策をしばらく探しましたが、常に MultiByteToWideChar と WideCharToMultiByte を介して解決策に遭遇します。ただし、これは機能しないようです。ここで何が欠けていますか?

私もここで解決策を探しましたが、ほとんどのUTF8の質問はC#とphpのものを扱っています。

4

4 に答える 4

3

VC++2010 の Windows では、ローカリゼーション ファセット std::codecvt_utf8_utf16 (つまり、C++11) を使用することが可能です (私が知る限り、GCC にはまだ実装されていません)。cppreference.comのサンプル コードには、UTF-8 ファイルの読み取り/書き込みに必要なすべての基本情報が含まれています。

std::wstring wFromFile = _T("teststring");
std::wofstream fileOut("textOut.txt");
fileOut.imbue(std::locale(fileOut.getloc(), new std::codecvt_utf8_utf16<wchar_t>));
fileOut<<wFromFile;

ANSI エンコード ファイルを UTF-8 (メモ帳でチェック) に設定します。これがあなたが必要とするものであることを願っています。

于 2012-07-25T09:50:57.873 に答える
2

Windows では、ファイルにエンコーディングがありません。各アプリケーションは、独自のルールに基づいてエンコーディングを想定します。あなたができる最善の方法は、ファイルの先頭にバイトオーダーマークを付けて、それが認識されることを願うことです.

于 2012-07-26T01:16:06.093 に答える
0

AFAIKfprintf()は文字変換を行うため、UTF-8でエンコードされたデータを渡しても実際にUTF-8がファイルに書き込まれるという保証はありません。すでにデータを自分で変換しているfwrite()ので、代わりに使用して、UTF-8 データをそのまま書き込みます。たとえば、次のようになります。

DWORD dwCount = MultiByteToWideChar( CP_ACP, 0, line.c_str(), line.length(), NULL, 0 );  
if (dwCount == 0) continue;

std::vector<WCHAR> utf16Text(dwCount);  
MultiByteToWideChar( CP_ACP, 0, line.c_str(), line.length(), &utf16Text[0], dwCount );  

dwCount = WideCharToMultiByte( CP_UTF8, 0, &utf16Text[0], utf16Text.size(), NULL, 0, NULL, NULL );  
if (dwCount == 0) continue;

std::vector<CHAR> utf8Text(dwCount);  
WideCharToMultiByte( CP_UTF8, 0, &utf16Text[0], utf16Text.size(), &utf8Text[0], dwCount, NULL, NULL );  

fwrite(&utf8Text[0], sizeof(CHAR), dwCount, pOutputFile);  
fprintf(pOutputFile, "\n");  
于 2012-07-26T01:12:33.083 に答える