【问题标题】:Write C++ file with standard ofstream in UCS-2 LE w/o BOM encoding在不带 BOM 编码的 UCS-2 LE 中使用标准 ofstream 编写 C++ 文件
【发布时间】:2011-05-30 12:39:06
【问题描述】:

当我使用标准 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;
}

【问题讨论】:

  • 您可能应该在输出行中包含“&lt;&lt; endl”。您正在寻找的是平台相关的。 Notepad++ 的提及暗示了 Windows,UCS-2 LE 也是如此(可能应该是 UTF-16LE,尽管它们基本上是一样的)。您可能需要查看手册。这可能是不可能的;如果是这样,您可能需要打开宽字符编码,并且使用宽字符串文字 (L"Hello World") 会有所帮助,而不是阻碍。
  • 这种不断编写 BOM 以允许另一个读取文件的程序正确猜测编码的冲动是怎么回事?为什么不使用 EBCDIC?
  • 实际上我想要的输出文件的字符编码是:UCS-2 LE w/o BOM.converting string to stream没有帮助,L“Hello World”也没有帮助。那么EBCDIC呢,如何这样做?

标签: c++ file byte-order-mark ofstream


【解决方案1】:

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

您需要确定几件事:

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

然后你就会知道如何在两者之间进行转换。

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

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

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

编辑:

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

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

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

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

【讨论】:

  • 我不确定您对内部/外部编码的要求是什么。n 如何知道是否有描述?我添加了我的源代码,请参见上文。感谢您的链接。
  • 谢谢 Martin York,但现在我知道它是内部编码,那么我应该如何进行编码?我不知道。不过,您给定的链接似乎无法证明它的标题与输出。
猜你喜欢
  • 2013-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 2019-09-27
  • 2020-01-15
  • 2016-09-29
相关资源
最近更新 更多