2014-02-18 29 views
1

。 我是新来的C++。我必须找出文件包含的用户传递的编码类型。但我不知道如何检查文件的编码。所以我需要打印的文件是unicode或ansi或unicode big endian或utf8.I已经搜索了很多,但无法找到解决方案。到现在我已经做是我打开的文件:如何在C++中找到txt文件的编码?

#include "stdafx.h" 
#include <iostream.h> 
#include <stdio.h> 
#include<conio.h> 
#include <fstream> 
using namespace std; 



int _tmain(int argc, _TCHAR* argv[]) 
{ 
    fstream f; 
    f.open("c:\abc.txt", fstream::in | fstream::out); /* Read-write. */ 


    getch(); 
    return 0; 
} 

所以请谁能告诉我的代码解决这个。

如果我正在访问记事本文件,该怎么办?

Thanx提前..

+4

你不能找出使用哪种编码,你只能_predict_它。您应阅读以下内容:http://www.joelonsoftware.com/articles/Unicode.html –

+3

如果文件具有BOM,请使用BOM。如果不是,请询问用户。这是确保的唯一方法。 –

+0

@jonathan如何检查文件中的物料清单可以请您向我解释。 。 –

回答

1

在这里,我已经找到一种方法来检测记事本文件,无论是Unicode,大端,UTF8或简单的ANSI文件:

我发现,当我在默认情况下在记事本中保存文件时,它存储字节标记(BOM)在文件开头。因此我决定按照此问题中的早先建议使用它。

首先我读了1个字节的文件。 我已经知道, 1.如果文件是Unicode文件,那么它的前两个字符存储FE FF,即254.255是十进制等效的。 2.如果文件是UTF8文件,那么它的第一个字符存储FF和239是它的十进制等值。

这里是代码:

#include<conio.h> 
#include<stdio.h> 
#include<string.h> 
int main() 
{ 
     FILE *fp=NULL; 
     int c; 
     int a[2]; 
     int i; 
     fp=fopen("c:\\abc.txt","rb"); 

     if (fp != NULL) 
     { 
      while (i<=3) 
      { 
         c = fgetc(fp);  
         printf("%d",c); 
          if(c==254) 
          { 
           printf("Unicode Big Endian File"); 
          } 
          else if(c==255) 
          { 
           printf("Unicode Little Endian File"); 
          } 
          else if(c==239) 
          { 
           printf("UTF8 file"); 
          } 
          else 
          { 
           printf("ANSI File"); 
          } 

       } 
       fclose(fp); 

     } 


     getchar(); 

    return 0; 
} 

这工作得很好了me.Hope会为别人也行。

5

你不能。

您可以做的最好的事情是guess it或将编码保存为文件结构的一部分(如果可以的话)。

+0

记事本++为什么总是知道以正确的格式显示txt文件? – michaeltang

+3

它不!它使用英文文本做出了很好的猜测。但我已经看到很多次与非英语来源失败,如俄罗斯可以是Windows-1251或KOI8-R(其他几个),所以我不得不去编码 - >字符集 - >西里尔语,并尝试之前,夫妇,之前我可以阅读文本。 – oleksii

1

你无法知道文本文件的编码是什么。一种方法是在文件的开始处查找BOM,然后告诉你文本是否在Unicode。但是,BOM不是强制性的,所以你不能依赖这个来区分Unicode和其他编码。

提出这个问题的一种非常常见的方式是there is no such thing as plain text

我是西班牙语,你可以很容易地在这里找到7位ASCII,扩展ASCII,ISO-8859-1(又名拉丁语1,其中包括西欧所需的许多常见额外字符)的文本文件,也UTF在其varios风格。

希望这有助于。

1

正如所讨论的here你能做的唯一的事情就是guess其中最有可能抛出无效的最佳顺序匹配

您应该检查,顺序如下:

  • 是否有一个UTF-16 BOM开头?那么它可能是UTF-16。使用BOM作为大端或小端的指示符,然后检查文件的其余部分是否符合。
  • 开头是否有UTF-8 BOM?那么它可能是UTF-8。检查文件的其余部分。
  • 如果上述内容没有导致肯定匹配,请检查整个文件是否为有效的UTF-8。如果是,它可能是UTF-8。
  • 如果上述不会导致正面匹配,则可能是ANSI。
+1

还有一个应该考虑的UTF-32 BOM。除此之外,它主要是猜测,最有可能的猜测取决于语言环境。我在哪里(或曾经),如果整个文件将是合法的UTF-8,那可能就是这样;否则,无论是ISO 8859-1还是ISO 8859-15(但到那时候,你真的在​​猜测)。 –

+1

另外,如果每个其他字节都是0,或者其中大部分都是,那么它可能是UTF-16,大端或小端,具体取决于哪个字节是0.这同样适用于四个0和UTF-32中的三个字节。 –