1

標準の ofstream でファイルを出力すると、Notepad++ で ASCII\ANSI エンコーディングが表示されますが、これは正常だと思いますが、BOM なしの UCS-2 LE ではこれが必要です。このコードで何を変更すればよいかわかりません - 助けてもらえますか?

これは、BOM なしの UCS-2 LE の文字エンコーディングを使用したメッセージ ファイル形式 (.vmg) であり、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)。

いくつかのことを決定する必要があります。

  • 内部で使用されるエンコーディング。
  • 外部で使用されるエンコーディング。

次に、2 つの間でどのように変換できるかがわかります。

UTF-16orのような固定幅の内部表現を選択すると便利です(技術的には固定幅ではありませんが、固定幅であり、十分に近いことはUTF-32わかっています)。UTF-16UCS-2

外部表現は固定幅である必要はありませんが、UCS-2 (UTF-16) が必要なようです。したがって、外部形式と一致する内部形式を選択した場合、変換は必要なく、文字列をストリームに吐き出すだけです。

内部表現と外部表現の間に矛盾がある場合 ( LE -> BE のように)、2 つの間で変換する必要があります。これを行うには、codecvtファセットとimbueファイル ストリームを適切なlocale. 手順はここにあります: writing-utf16-to-file-in-binary-mode

編集:

内部エンコーディングを知っている(選択したため)。

外部エンコーディング: ファイルによって異なります:

ファイルを作成した場合は、そのエンコーディングがわかります。別のプログラムがファイルを作成した場合は、エンコーディングを解決する必要がある場合があります。たとえばBOM、ファイルの先頭にある (バイト オーダー マーク) を読み取ります。そうすれば、それがUTF-8UTF-16LEUTF-16BEまたはであるかどうかがわかりますUTF-32

他のエンコーディングの場合は、試して解決するのが難しいか、推測する必要があります。

于 2010-12-24T23:07:22.067 に答える