Как записать строку в кодировке UTF-8 в файл в Windows, на C ++ - PullRequest
3 голосов
/ 20 октября 2010

У меня есть строка, которая может содержать или не содержать символы Юникода, я пытаюсь записать ее в файл в Windows. Ниже я опубликовал пример кода, моя проблема в том, что когда я открываю и считываю значения из окон, все они интерпретируются как символы UTF-16.

char* x = "Fool";
FILE* outFile = fopen( "Serialize.pef", "w+,ccs=UTF-8");
fwrite(x,strlen(x),1,outFile);
fclose(outFile);

char buffer[12];
buffer[11]=NULL;
outFile = fopen( "Serialize.pef", "r,ccs=UTF-8");
fread(buffer,1,12,outFile);
fclose(outFile);

Символы также интерпретируются как UTF-16, если я открываю файл в wordpad и т. Д. Что я делаю не так?

Ответы [ 2 ]

4 голосов
/ 20 октября 2010

Да, когда вы указываете, что текстовый файл должен быть закодирован в UTF-8, CRT подразумевает, что вы будете записывать текст Unicode в файл.Не делать это не имеет смысла, вам не понадобится UTF-8.Это будет работать правильно:

wchar_t* x = L"Fool";
FILE* outFile = fopen( "Serialize.txt", "w+,ccs=UTF-8");
fwrite(x, wcslen(x) * sizeof(wchar_t), 1, outFile);
fclose(outFile);

Или:

char* x = "Fool";
FILE* outFile = fopen( "Serialize.txt", "w+,ccs=UTF-8");
fwprintf(outFile, L"%hs", x);
fclose(outFile);
1 голос
/ 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...
    
...