c++ - 在不带 BOM 编码的 UCS-2 LE 中使用标准 ofstream 编写 C++ 文件

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

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

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

最佳答案

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

您需要确定几件事:

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

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

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

外部表示不需要固定宽度,但您似乎需要 UCS-2 (UTF-16)。因此,如果您选择一种与外部格式相匹配的内部格式,则不需要转换,您只需将字符串输出到流中即可。

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

编辑:

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

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

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

如果是其他编码,尝试计算出来可能会比较困难,或者您只能猜测一下。

关于c++ - 在不带 BOM 编码的 UCS-2 LE 中使用标准 ofstream 编写 C++ 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4528380/

相关文章:

c++ - 是在堆上自动创建的特征矩阵吗?

c++ - QGraphicsScene位置问题

c++ - Const 和非常量访问解析为不同的重载?

linux - 为什么 bash 不能识别套接字文件的存在

c++ - 使用 SFINAE 检查 C++ 中的模板父类

python - 在 Python 中从一个目录(包含大量文件)中选择一个随机文件

linux - 我如何在 Linux 中获得/dev/one 的等价物

c# - 十六进制值 0x00 是加载 XML 文档的无效字符

c++ - 字节顺序标记真的是一个有效的标识符吗?

python - Unicode解码错误: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte error in python while reading a csv file