С++ как писать/читать поток в unicode/utf8

У меня есть текстовый файл ut8, который читается с помощью простого:

ifstream in("test.txt");

теперь мне нравится создавать новый файл, который будет кодировать ut8 или Unicode как я могу это сделать с помощью потока или другого? это создает мне ansi Encoding.

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

Ответ 1

Хорошо, о переносном варианте. Это легко, если вы используете стандарт C++11 (потому что есть много дополнительных, таких как "utf8", что навсегда разрешает эту проблему).

Но если вы хотите использовать многоплатформенный код со старыми стандартами, вы можете использовать этот метод для записи с потоками:

  • Прочитайте статью об конвертере UTF для потоков
  • Добавить stxutif.h в ваш проект из источников выше
  • Откройте файл в режиме ANSI и добавьте спецификацию в начало файла, например:

    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();
    
  • Затем откройте файл как 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...