2

我有一个巨大的文件,其中包含开头的 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();
4

2 回答 2

4

Keith Thompson 的问题非常重要。根据哪种 Unicode 编码,编写一个小的 C 例程来读取(和丢弃)Unicode 字符可能很简单,或者稍微复杂一些。

假设编码是 UTF-8,您将无法确定何时停止丢弃,因为 ASCII 是 UTF-8 的子集,所以每当您遇到 ASCII 字符时,您可能会想说“就是这样,我们”重新回到 ASCII 领域”,下一个字符可能仍然在 ASCII 范围之外。

因此,您需要读取文件并确定最后一个字符>127 的位置。之后的任何内容都是纯 ASCII——希望如此。

于 2012-12-04T06:58:20.500 回答
0

文本文件通常只有一种编码 utf-8、utf-16(大端或小端)或 utf-32(大或小)或 ASCII 或其他 ANSI 代码页。编码的混合只能以某些自定义方式进行。

也就是说,您将不得不读取您需要的数据以及您不需要使用相同编码的数据。如果您知道格式是 utf-8,您可以根据您要对数据执行的操作,将文件作为二进制文件逐个读取到 char 缓冲区中。然后,您可以使用类似 strnextc 的 API(在 Windows 上。等效的 API 必须在其他平台上可用)在缓冲区上逐个字符地移动。一旦到达终点 - 您可以将余额移动到缓冲区的前面并从文件中加载缓冲区的其余部分。

实际上,您通常可以将上述方法用于任何编码。但是对于 utf-16,您可以尝试使用 wifstream - 只要文件的字节序和您将运行的平台相同。并且您需要检查 wifstream 的实现是否擅长处理 endiness 的变化并且能够处理 BOM(字节顺序标记) - 通常存在于的 2 字节序列(“FE FF”或“FF FE”)文件的开头 - 不用管代理对。

于 2012-12-04T07:23:01.823 回答