我有这个巨大的文件,开头包含unicode字符串(第一个~10,000个字符左右)
我不关心unicode部分,我感兴趣的部分不是unicode,但每当我尝试读取那些部分时,我得到'='
,如果我要将整个文件加载到char数组并写入使用ofstream
得到一些临时文件(不改变数据)我得到的数据不正确实际上我得到的是一个用Í
填充的文本文件如果我要手动删除unicode部分一切正常,那么它似乎ifstream
无法处理包含unicode数据的流,但如果这个假设是真的,有没有办法处理这个文件,为我的项目引入一个新的库?
谢谢,
编辑:这是一个示例代码,程序读取此文件,其中包含无法用ASCII表示的字符(部分,而不是全部)。
ifstream inFile("somefile");
inFile.seekg(0,ios_base::end);
size_t size = inFile.tellg();
inFile.seekg(0,ios_base::beg);
char *book = new char[size];
inFile.read(book,size);
for (int i = 0; i < size; i++) {
cout << book[i] << " " << i << endl; //book[i] will always be '='
}
ofstream outFile("TEST.txt");
outFile.write(book,size);
outFile.close();
答案 0 :(得分:4)
假设编码为UTF-8,您将无法确定何时停止丢弃,因为ASCII是UTF-8的子集,所以每当遇到ASCII字符时,您可能会想说“这就是它,我们回到ASCII版本“,下一个字符仍然可能仍然在ASCII范围之外。
因此,您需要阅读文件并确定最后一个字符&gt; 127的位置。之后的任何东西都是纯ASCII - 希望如此。
答案 1 :(得分:0)
文本文件通常只有一种编码:utf-8,utf-16(大或小端)或utf-32(大或小)或ASCII或其他ANSI代码页。只能通过一些自定义方式混合编码。
也就是说,您必须阅读所需的数据以及不同的编码。如果您知道格式为utf-8,您可以根据您要对数据执行的操作,将文件作为二进制文件逐个读取到char缓冲区中。然后你就可以使用像strnextc这样的API(在windows上。等效的API必须在其他平台上可用)来逐个字符地移动缓冲区。到达终点后 - 您可以将余额移动到缓冲区的前面,然后从文件中加载剩余的缓冲区。
事实上,您可以将上述方法用于任何编码。但对于utf-16,您可以尝试使用wifstream - 只要文件的endianess和您将运行的平台是相同的。并且您需要检查wifstream的实现是否善于处理耐力的变化并且能够处理BOM(字节顺序标记) - 2字节序列(&#34; FE FF&#34;或&#34; FF FE&#34;)通常出现在文件的开头 - 单独留下代理对。