2016-10-05 6 views
-1

C++のギリシャ語の辞書のようなプログラムを作成したいと思い、CodeBlocksを使用しています。問題は、コンソールやファイルとの間で非ASCII文字を読み書きする方法を理解できないことです。私はwchar_t、char32_tなどのようにオンラインで見つかったさまざまな方法を試しましたが、どれも私のために働いていませんでした。C++でファイルと標準入力を使用してUnicode-32文字を読み書きする方法は?

wchar_t c; 
wcin>>c; 
wcout<<c<<"\n"; 

上記のコードは、「単純な」ギリシャ文字、たとえば「α」のために機能しました。それは 'ᾧ'のようなポリトニック文字では機能しませんでした。私は、それらを入力したときは常に具体的には、polytonicギリシャ文字は、コンソールに疑問符として登場。

wchar_t c; 
wifstream wfin("test_unicode.txt"); 
wfin>>c; 
wcout<<c<<"\n"; 

上記のコード、任意の入力のためにも、ラテン文字を動作しませんでした。出力は常に空白でした。

wchar_t c = 'α'; 
wcout<<c<<"\n"; 

はまた、私は、プログラム内のギリシャ文字ではwchar_tかwstringの変数を初期化することができていない、上記のコードは、私の画面上には何も出力しません。

助けてください!

+0

Unicode-32とUTF-8を混同しないでください。 – user31264

+1

私は、あなたの質問を絞り込むことをお勧めします。指定されたエンコーディングでテキストファイルを読むことになります(btw UTF8はUTF32よりはるかに一般的です。 2.入力ファイルが本当に必要なエンコーディングであることを確認します(おそらく、ファイルの16進数ダンプを見てください)。 3. [MVCE](http://stackoverflow.com/help/mcve)にファイルの読み取りを試みます。 – hyde

+2

もう1つのことは、端末があなたが望む文字を表示できることをテストする必要があります。できない場合は、出力をファイルにリダイレクトし、その16進ダンプを検査する必要があります。この文字を表示できない理由は、少なくとも、ターミナルはそれらの文字をも持っていないエンコーディングを使用しているので、それらの文字のフォントがありません(代わりにプレースホルダーグリフが描画されます)。 – hyde

答えて

0

UTF-8std::fstreamあなたは、単にオープン、Linux上でベースのシステムを使用して、ストリームを使用します

fout << "English\n" << u8"ελληνική\n"; 

UTF-32はほとんど使用されません。

UTF-16がWindowsで使用されていますが、もう少し複雑です。 wchar_tstd::wstringstd::wstreamで動作し、ワイド文字列API関数を使用します。例:MessageBoxW(0, L"Test", 0, 0);Code :: Blockは、デフォルトではANSI APIの非推奨となっています。プロジェクトにUNICODEを定義するか、Visual Studioのような互換性の高いIDEを使用する必要があります。

UTF-16で読み書きするには、std::wifstream/std::wofstreamを使用し、imbueを呼び出します。 UTF-16の例:

std::wofstream ofs(filename); 
if (ofs) 
{ 
    ofs.imbue(std::locale(ofs.getloc(), 
     new std::codecvt_utf16<wchar_t, 0x10ffff, std::little_endian>)); 

    //write BOM marker (Byte order mark, optional) 
    ofs << L"\xFEFF"; 

    //file is ready for writing: 
    ofs << L"ελληνική\r\n"; 

    const wchar_t* buf = L"English\r\n"; 
    ofs << buf; 

    ofs.close(); 
} 

std::wifstream ifs(filename); 
if (ifs) 
{ 
    ifs.imbue(std::locale(ifs.getloc(), 
     new std::codecvt_utf16<wchar_t, 0x10ffff, std::little_endian>)); 

    //skip BOM, optional 
    ifs.seekg(2, std::ios::beg); 

    //file is ready for reading: 
    std::wstring res; 
    std::wstring str; 
    while (ifs >> str) 
     res += str + L"\n"; 

    MessageBoxW(0, res.c_str(), 0, 0); 
    ifs.close(); 
} 

また、Windowsでファイルの読み書きにUTF-8を使用してください。しかし、Windows APIで使用する場合は、UTF-16に変換する必要があります。

+0

Visual Studioでは、ワイドクラス+関数がUTF-16ではなくUCS-2を処理することに注意してください。 –

+0

@MooingDuck WindowsはWindows 2000のリリースからUTF-16を使用しています。UCS-2はずっと前から廃止されました。 –

+1

これは100%正確ですが、無関係です。Windows APIはUTF-16を使用できますが、Visual Studioに付属するC++標準ライブラリのワイドクラス+関数は、UTF-16ではなくUCS-2を処理します。関数を見てみましょう。それらは2バイトの入力だけを取る:http://en.cppreference.com/w/cpp/header/cwctype。 'isalpha'はおそらくBMPの外部で動作することはできません。 –

関連する問題