2015-06-17 4 views
0

Использование компиляции unicode в vs2008 Как вы можете выводить многие языковые символы в файл на C++ с помощью wofstream?C++ проблема wofstream в программе unicode

Я могу сделать это в коде C без проблем, например.

FILE *out; 
if((out = _wfopen(L"test.txt", L"wb")) != NULL) 
{ 
    fwprintf(out,L"test\r\n"); 
    fwprintf(out,L"наказание\r\n"); 
    fwprintf(out,L"ウェブ全体から検索\r\n"); 
} 

при открытии файла все это правильно, но с программой ниже C++ все я получаю это первая линия, и я попытался локаль :: глобальные (региональные настройки («»)); с тем же результатом.

wofstream MyOutputStream(L"test.txt"); 
if(!MyOutputStream) 
{ 
    AfxMessageBox(L"Error opening file"); 
    return; 
} 

    MyOutputStream << L"test\r\n"; 
    MyOutputStream << L"наказание\r\n"; 
    MyOutputStream << L"ウェブ全体から検索\r\n"; 

    MyOutputStream.close(); 

и я попытался вставить это с таким же результатом: -

std::locale mylocale(""); 
    MyOutputStream.imbue(mylocale); 
+0

Как вы скажете, что результат неправильный. Попробуйте открыть текстовый файл с помощью Блокнота и сообщить блокноту, чтобы открыть его как Unicode – marom

+0

Возможно, это проблема с промывкой? Попробуйте вызвать MyOutputStream.flush() или добавить std :: endl где-то – KABoissonneault

+0

попробовал оба ... тот же. – user3725395

ответ

1

работал его ... вот это: -

wofstream MyOutputStream(L"c:\\test2.txt", ios_base::binary); 

    wchar_t buffer1[128]; 
    MyOutputStream.rdbuf()->pubsetbuf(buffer1, 128); 
    MyOutputStream.put(0xFEFF); 
    MyOutputStream << L"test\r\n"; 
    MyOutputStream << L"наказание\r\n"; 
    MyOutputStream << L"ウェブ全体から検索\r\n"; 
+0

Вам не нужно будет предоставлять собственный буфер. Но вывод символа '0xFEFF' (кодировка Unicode' U + FEFF WIDTH NO-BREAK SPACE') выводит [BOM] (https://en.wikipedia.org/wiki/Byte_order_mark) в начале файла, чтобы помочь текст редакторы знают, что файл закодирован в Юникоде. Вы также можете использовать 'MyOutputStream << L" \ xFEFF ";' для этого вместо 'MyOutputStream.put (0xFEFF)'. –

+0

хорошо бы так подумал, но я нашел попытку, чтобы я не получил проблемы с выпуском. – user3725395

+0

Итак, я достал только: MyOutputStream.put (0xFEFF); и он все еще работает/открывается правильно в блокноте, блокнот ++. , но без буфера он ничего не пишет. Я заметил, открыв файл txt для вывода программы C, который FEFF вообще не был в файле. – user3725395

0

окончательный код, который работает в: -

wofstream MyOutputStream(L"c:\\test2.txt", ios_base::binary); 
    if(!MyOutputStream) 
    { 
    AfxMessageBox(L"Error opening file"); 
    return; 
    } 
    wchar_t buffer1[128]; 
    MyOutputStream.rdbuf()->pubsetbuf(buffer1, 128); 

    MyOutputStream << L"test\r\n"; 
    MyOutputStream << L"наказание\r\n"; 
    MyOutputStream << L"ウェブ全体から検索\r\n"; 

    MyOutputStream.close(); 
+0

примечание: wifstream то же самое, нужно использовать буфер и использовать ios_base :: binary – user3725395

 Смежные вопросы

  • Нет связанных вопросов^_^