このコードは役立つかもしれません(VC++ 2010でコンパイルされました)。私は非ラテン文字を含むUTF-8ファイルでテストしましたが、うまくいくように見えますが、中国語の文字でうまく動作するかどうかはわかりません。詳細については、_setmodeおよびcodecvt_utf8の次のリンクを確認してください。
#include <iostream>
#include <fstream>
#include <string>
#include <locale>
#include <codecvt>
#include <fcntl.h>
#include <io.h>
using namespace std; // Sorry for this!
void read_all_lines(const wchar_t *filename)
{
wifstream wifs;
wstring txtline;
int c = 0;
wifs.open(filename);
if(!wifs.is_open())
{
wcerr << L"Unable to open file" << endl;
return;
}
// We are going to read an UTF-8 file
wifs.imbue(locale(wifs.getloc(), new codecvt_utf8<wchar_t, 0x10ffff, consume_header>()));
while(getline(wifs, txtline))
wcout << ++c << L'\t' << txtline << L'\n';
wcout << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
// Console output will be UTF-16 characters
_setmode(_fileno(stdout), _O_U16TEXT);
if(argc < 2)
{
wcerr << L"Filename expected!" << endl;
return 1;
}
read_all_lines(argv[1]);
return 0;
}
期待通りに中国語の文字が見えない場合は、必ずコンソールがサポートするフォントを使用されていることを確認UTF-16(すなわち、ビットマップフォントを使用しないでください)。
「コードページ」をUTF-8からコンソールが漢字に使用するコードページに変更する必要があるように聞こえます。 MultiByteToWideCharを呼び出してUTF-8からUnicodeに変更し、続いてWideCharToMultiByteを使用してUnicodeからローカルコードページに変更します。 – john
おそらくコンソールの故障です。 '>' 'ファイルを試してみてください。有効なUTF-8が中国語の文字であると判明した場合、プログラムはうまくいきます。これはWindowsの質問です。 (もちろん、Windowsを回避するためにあなたのプログラムを変更する必要があるかもしれませんが、誰が間違っているのか分かります) – aib
@aibはい、std :: string変数を別のファイルにリダイレクトすると、 Chiese文字を含むUTF-8。私のコンソールのコードページは '' 936(ANSI/OEM - 简体中文GBK) ''です。 –