web-dev-qa-db-ja.com

c ++ユニコード/ utf8でのストリームの書き込み/読み取り方法

私はUTF-8テキストファイルを持っています。これは単純なものを使用して読んでいます:

ifstream in("test.txt");

次に、UTF-8エンコーディングまたはUnicodeになる新しいファイルを作成したいと思います。 ofstreamまたはその他でこれを行うにはどうすればよいですか?これにより、ANSIエンコーディングが作成されます。

ofstream out(fileName.c_str(), ios::out | ios::app | ios::binary);
12
user63898

わかりました、ポータブルバリアントについて。 C++11標準を使用する場合は簡単です(この問題を永久に解決する"utf8"のような追加のインクルードがたくさんあるため)。

ただし、古い標準でマルチプラットフォームコードを使用する場合は、次の方法を使用してストリームで記述できます。

  1. ストリーム用のUTFコンバーターに関する記事を読む
  2. 上記のソースからプロジェクトにstxutif.hを追加します
  3. 次のように、ファイルをANSIモードで開き、ファイルの先頭にBOMを追加します。

    std::ofstream fs;
    fs.open(filepath, std::ios::out|std::ios::binary);
    
    unsigned char smarker[3];
    smarker[0] = 0xEF;
    smarker[1] = 0xBB;
    smarker[2] = 0xBF;
    
    fs << smarker;
    fs.close();
    
  4. 次に、ファイルをUTFとして開き、そこにコンテンツを書き込みます。

    std::wofstream fs;
    fs.open(filepath, std::ios::out|std::ios::app);
    
    std::locale utf8_locale(std::locale(), new utf8cvt<false>);
    fs.imbue(utf8_locale); 
    
    fs << .. // Write anything you want...
    
6
Yarkov Anton