为啥我在我的文件数据之前得到这些无效字符?

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。

【讨论】:

以上是关于为啥我在我的文件数据之前得到这些无效字符?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在我的 Swift 文件中解包 nil?

为啥我的Cookies不能保存信息?

Parse.com JSON 导入抛出:键类型无效...,预期日期,但得到字符串

使用Python计算zip文件中具有不同格式的文件数

无法弄清楚为啥我在我的 jsonp 序列化中得到重复数据

java 提取文件夹中的文件数,由字符串类型folderName命名