Записать файл C++ со стандартным потоком в UCS-2 LE без кодировки спецификации

Когда я вывожу файл со стандартным потоком, он показывает кодировку ASCII\ANSI в Notepad++, что я считаю нормальным, но мне нужно это в UCS-2 LE без спецификации. Я не знаю, что я должен изменить в этом коде, вы можете помочь?

Это формат файла сообщения (.vmg) с кодировкой символов в UCS-2 LE без спецификации, и это то, что я хочу создать на С++.

#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;



int main()
{
double i,j;
stringstream sstream;
cout<<"Number Start from:";
cin>>i;
cout<<"\nNumber ends in:";
cin>>j;


for(i;i<=j;)
{

sstream <<i<<".vmg";
string ss = sstream.str();

ofstream sout(ss.c_str());
sout<<"BEGIN:VMSG"<<'\n'<<"VERSION:1.1"<<'\n'<<"X-IRMC-STATUS:"<<'\n'<<"X-IRMC-BOX:INBOX"<<'\n'<<"X-NOK-DT:20101224T190106Z"<<'\n'<<"X-MESSAGE-TYPE:SUBMIT"<<'\n'<<"BEGIN:VCARD"<<'\n'<<"VERSION:3.0"<<'\n'<<"N:"<<'\n'<<"TEL:"<<'\n'<<"END:VCARD"<<'\n'<<"BEGIN:VENV"<<'\n'<<"BEGIN:VCARD"<<'\n'<<"VERSION:3.0"<<'\n'<<"N:"<<'\n'<<"TEL:6969"<<'\n'<<"END:VCARD"<<'\n'<<"BEGIN:VENV"<<'\n'<<"BEGIN:VBODY"<<'\n'<<"Date:24.12.2010 19:01:06"<<'\n'<<"bid "<<i<<'\n'<<"END:VBODY"<<'\n'<<"END:VENV"<<'\n'<<"END:VENV"<<'\n'<<"END:VMSG"<<endl;
sstream.str("");
i=i+0.01;
}
return 0;
}

person Omar    schedule 24.12.2010    source источник
comment
Вероятно, вам следует включить «<< endl» в строку вывода. То, что вы ищете, зависит от платформы. Упоминание Notepad ++ предполагает Windows, как и UCS-2 LE (вероятно, должно быть UTF-16LE, хотя в основном это одно и то же). Скорее всего, вам придется заглянуть в мануалы. Это может быть невозможно; если это так, вам, вероятно, потребуется включить широкоформатное кодирование, и использование широкострочного литерала (L"Hello World") поможет, а не помешает.   -  person Jonathan Leffler    schedule 25.12.2010
comment
Что за непрекращающееся стремление не писать спецификацию, чтобы позволить другой программе, которая читает файл, правильно угадать кодировку? Почему вы не используете EBCDIC?   -  person Hans Passant    schedule 25.12.2010
comment
На самом деле моя желаемая кодировка символов выходного файла: UCS-2 LE без спецификации. Преобразование строки в поток не помогает, и LHello World не помогает. А как насчет EBCDIC, как это сделать?   -  person Omar    schedule 25.12.2010


Ответы (1)


С++ std::string не имеют явного кодирования (они просто контейнеры char).

Вам нужно определить пару вещей:

  • Кодировка, используемая внутри.
  • Кодировка используется извне.

Тогда вы будете знать, как вы можете конвертировать между ними.

Полезно выбрать внутреннее представление с фиксированной шириной, например UTF-16 или UTF-32 (я знаю, что технически UTF-16 не является фиксированной шириной, но UCS-2 есть, и это достаточно близко).

Внешнее представление не обязательно должно иметь фиксированную ширину, но вам, похоже, нужен UCS-2 (UTF-16). Таким образом, если вы выберете внутренний формат, который соответствует внешнему формату, то перевод не требуется, и вы просто передаете строку в поток.

Если есть несоответствие между вашим внутренним и внешним представлением (например, LE -> BE), вам необходимо преобразовать их. Для этого используйте codecvt фасет и imbue файловый поток с соответствующим locale. Инструкции можно найти здесь: в двоичном режиме

Редактировать:

Вы знаете внутреннюю кодировку (поскольку вы сделали выбор).

Внешняя кодировка: это будет зависеть от файла:

Если вы создали файл, вы будете знать его кодировку. Если другая программа создала файл, вам, возможно, придется работать с кодировкой. Например, прочитав BOM (знак порядка следования байтов) в начале файла. Таким образом, вы можете сказать, является ли это UTF-8, UTF-16LE, UTF-16BE или UTF-32.

Если это какая-то другая кодировка, может быть сложнее попытаться разобраться, или вам просто нужно угадать.

person Martin York    schedule 24.12.2010
comment
Я не уверен, что вы спрашиваете о внутренней/внешней кодировке. Как узнать, есть ли расшифровка? Я добавил свой исходный код, пожалуйста, смотрите выше. И спасибо за ссылку. - person Omar; 25.12.2010
comment
Спасибо, Мартин Йорк, но теперь я знаю, что это внутренняя кодировка, тогда как мне быть с кодировкой ?? Я понятия не имею. Ваша данная ссылка, похоже, не соответствует ее названию с выводом. - person Omar; 26.12.2010