2014-10-01 1 views
0

В Linux у меня возникли проблемы с записью UTF-16 для работы с использованием класса stream, в то время как тот же код отлично работает в Windows. Ниже приведен пример кодаПочему thestream не пишет utf16 на linux в двоичном режиме?

MyString content; 
content = L"hello\r\n"; 
const short unsigned int* output = content.asUnicodeType<MyString::UTF16>().c_str(); 
ofstream outFile("test.txt", std::ios::out | std::ios::binary); 
outFile.write((char *)output, content.size() * sizeof(MyString::UTF16)); 
//outFile.write((char *)content.c_str(), content.size() * sizeof(wchar_t)); 
outFile.close(); 
return 0; 

Я подтвердил, что выход правильно преобразуется в UTF-16 формат

(gdb) x /16b output 
0x61a288:  104  0  101  0  108  0  108  0 
0x61a290:  111  0  13  0  10  0  0  0 

Однако, после того, как закончить, и я попытался открыть файл. Похоже, что контент записывается как UTF8, несмотря на то, что я прошу его писать в двоичном режиме.

Если я переключусь и напишу его как широкий символ, то контент правильно написан как UTF32 в Linux.

Любые предложения были бы замечательными!

PS: из-за ограничений платформы, я не могу использовать C++ 11 стандартных

Благодаря

+0

Что такое 'MyString'? – Deduplicator

+0

Это просто класс, который обертывает строку wchar_t. Это не имеет большого значения, поскольку я пишу содержимое вывода – chickenmagician

+0

Что вам дает 'od -t x1 test.txt'? –

ответ

1

Это на самом деле написано содержимое как UTF-16, но так как я пропустил BOM, файл откроется в Windows, Бесполезный Не признаю это, поэтому я подумал, что он написал контент как UTF8

1

Если content.asUnicodeType<MyString::UTF16>() возвращает std::string, то у вас есть неопределенное поведение. .c_str() возвращает строку c-string, принадлежащую std::string, но в вашем случае std::string является временным объектом, в результате чего его c-строка удаляется незамедлительно.

Чтобы исправить это, вы должны держать std::string вокруг до тех пор, как вам нужно с-строку:

auto output_s = content.asUnicodeType<MyString::UTF16>(); 
const short unsigned int* output = output_s.c_str(); 

Я не знаю, будет ли это исправить ваши проблемы, но это хорошая идея исправить неопределенное поведение в любом случае.

О, и, кстати, попробуйте использовать utf8 везде, особенно при чтении и записи файлов. Независимо от того, сколько усилий вы потратите, чтобы правильно использовать utf16, вы, вероятно, ошибаетесь. См. http://utf8everywhere.org

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