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

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

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

#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;
}

1 ответ

C++ std::string у них нет явного кодирования (это просто контейнеры char).

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам