Напишите файл 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
,
Если это какая-то другая кодировка, возможно, будет сложнее ее решить или вам просто нужно сделать предположение.