C ++, как писать / читать из потока в Unicode / UTF8 - PullRequest
12 голосов
/ 17 февраля 2011

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

ifstream in("test.txt");

Теперь я хотел бы создать новый файл в кодировке UTF-8 или Unicode. Как я могу сделать это с ofstream или другим? Это создает ANSI кодирование.

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

1 Ответ

6 голосов
/ 20 сентября 2012

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

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

  1. Прочтите статью о UTF-конвертере для потоков
  2. Добавьте stxutif.h в ваш проект из вышеперечисленных источников
  3. Откройте файл в режиме 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();
    
  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...
    
...