2014-02-18 56 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中的三個字節。 –