1

当我输出具有标准 ofstream 的文件时,它在 Notepad++ 中显示 ASCII\ANSI 编码,我认为这是正常的,但我在 UCS-2 LE w/o BOM 中需要它。我不知道我应该在这段代码中改变什么 - 你能帮忙吗?

这是一种消息文件格式(.vmg),在 UCS-2 LE 中具有字符编码,没有 BOM,这就是我想在 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;
}
4

1 回答 1

1

C++std::string没有显式编码(它们只是 的容器char)。

您需要确定几件事:

  • 内部使用的编码。
  • 外部使用的编码。

然后您将知道如何在两者之间进行转换。

选择一个固定宽度的内部表示是很有用的,比如UTF-16or UTF-32(我知道技术上UTF-16不是固定宽度,但UCS-2它是并且它足够接近)。

外部表示不需要固定宽度,但您似乎需要 UCS-2 (UTF-16)。因此,如果您选择与外部格式匹配的内部格式,则不需要翻译,您只需将字符串发送到流中。

如果您的内部和外部表示之间存在差异(例如LE -> BE),您需要在两者之间进行转换。为此,请使用codecvt带有imbue适当locale. 可以在此处找到说明:writing-utf16-to-file-in-binary-mode

编辑:

您知道内部编码(因为您做出了选择)。

外部编码:这将取决于文件:

如果您创建了文件,您将知道它的编码。如果另一个程序创建了该文件,您可能必须计算出编码。例如,通过读取BOM文件开头的(字节顺序标记)。这样你就可以判断它是UTF-8,UTF-16LE还是.UTF-16BEUTF-32

如果是其他编码,则可能更难尝试解决,或者您只需要猜测即可。

于 2010-12-24T23:07:22.067 回答