为啥我在我的文件数据之前得到这些无效字符?
Posted
技术标签:
【中文标题】为啥我在我的文件数据之前得到这些无效字符?【英文标题】:Why am i getting these invalid characters before my file data?为什么我在我的文件数据之前得到这些无效字符? 【发布时间】:2015-06-08 23:19:48 【问题描述】:我正在尝试通过getline
函数或fileContents.assign( (istreambuf_iterator<char>(myFile)), (istreambuf_iterator<char>()));
将文件读入字符串
任何一种方式都会给我上面的输出,如图所示。
第一种方式:
string fileContents;
ifstream myFile("textFile.txt");
while(getline(myFile,fileContents))
cout<<fileContents<<endl;
另一种方式:
string fileContents;
ifstream myFile(fileName.c_str());
if (myFile.is_open())
fileContents.assign( (istreambuf_iterator<char>(myFile) ),
(istreambuf_iterator<char>() ) );
cout<<fileContents;
【问题讨论】:
文件是utf编码的不是ascii吗?这些可能是前 4 个字节中的 BOM。 @rlb 它是一个简单的文本文件。 可悲的是,简单的文本已不再是过去的样子。为什么当我还是个孩子的时候文字就是文字。这些天来,它都是读取一个字节-读取一个字节-读取一个字节-字节-字节!我们读完字节了吗?每天起床时,我都要读四十英里的字节。上山。年轻的鲷鱼和他们的黄金 UTF。 【参考方案1】:文件以这些字符开头,很可能是 BOM 来告诉您文件的编码是什么。
您可能无法在 Windows 记事本中看到它们,因为记事本隐藏了编码字节。获得一个体面的文本编辑器,让您可以查看文件的二进制文件,并且您会看到这些字符。
【讨论】:
文本文件并不总是有一个,取决于它的编码方式。对于 UTF,幻数是 0xFF 和 0xFE。原始 ascii 根本没有幻数。 @EdMaster 我应该如何解决它?我应该怎么做才能避免这些字符?我需要应用任何编码技术吗?? 如果需要大声说出来:您的输入文件已损坏,请再次生成输入文件,确保您的工具不会插入它不会显示给您的幻数。 @EdMaster 我已经制作了 2 到 3 个 txt 文件,每个文件都有相同的无效字符 @cehnehdeh:0xFF 0xFE
是 UTF-16LE BOM。 Other possible BOMs 包括 0xEF 0xBB 0xBF
(UTF-8)、0xFE 0xFF
(UTF-16BE)、0xFF 0xFE 0x00 0x00
(UTF-32LE) 和 0x00 0x00 0xFE 0xFF
(UTF-32BE)。正如您所看到的,您还必须考虑 UTF-16LE 和 UTF-32LE BOM 之间的歧义(如果您需要处理 UTF-32 数据)。【参考方案2】:
您的文件以 UTF-8 BOM(字节 0xEF 0xBB 0xBF
)开头。您正在按原样读取文件的原始字节并将它们输出到使用codepage 437 的 OEM 字体的显示器。要正确处理文本文件,尤其是 Unicode 编码的文本文件,您需要读取前几个字节,检查 BOM(并且有 several you can look for),如果检测到则查找 BOM 并解释剩余的字节指定编码的文件,在本例中为 UTF-8。
【讨论】:
以上是关于为啥我在我的文件数据之前得到这些无效字符?的主要内容,如果未能解决你的问题,请参考以下文章