關於LINUX FILE命令是如何判斷檔案字符集的

dbasdk發表於2016-10-02
今天在使用file -i 檢視MYSQLDUMP檔案的時候其輸出為
charset=us-ascii with very long lines
我匯出的檔案應該是utf8的,為什麼會顯示ASCII呢,我們知道ASCII並沒有中文編碼,那麼真的有問題嗎?
然後用如下2個小程式測試了一下

點選(此處)摺疊或開啟

  1. #include<stdio.h>


  2. int main(void)
  3. {
  4.         FILE *p;
  5.         int i=0;
  6.         p=fopen("test11.txt","w+");
  7.         fputs("高鵬\n",p);
  8.         while(i<50000000)
  9.         {
  10.                 fputs("test",p);
  11.                 i++;
  12.         }

  13.         fputs("\n",p);
  14.         fclose(p);
  15.         return 0;
  16. }


點選(此處)摺疊或開啟

  1. #include<stdio.h>


  2. int main(void)
  3. {
  4.         FILE *p;
  5.         int i=0;
  6.         p=fopen("test10.txt","w+");
  7.         while(i<50000000)
  8.         {
  9.                 fputs("test",p);
  10.                 i++;
  11.         }

  12.         fputs("\n",p);
  13.         fputs("高鵬\n",p);
  14.         fclose(p);
  15.         return 0;
  16. }
實際上並沒有什麼不同這兩個檔案 test10 和test11 都有2行其中一個很長的行全部是test字串,第二行是高鵬
明顯他們應該返回UTF8編碼,但是並不是
gaopeng@bogon:~$ file -i test10.txt 
test10.txt: text/plain; charset=us-ascii
gaopeng@bogon:~$ file -i test11.txt 
test11.txt: text/plain; charset=utf-8

可以看到如果"高鵬"字串在第二行返回為ASCII而在第一行為UTF-8,我們可以推測出 file 命令是檢測檔案開頭的某些字元而返回的,並沒有全部檢視,或者有什麼其他演算法,但是他不是全部檢視。試想如果全部檢視一遍 一個200G的備份檔案瞬間就返回了結果也是不可能的。
在file的幫助中也明確的寫著
   Once file has determined the character set used in a text-type file, it will attempt to determine in what language the file is written.  The language tests
     look for particular strings (cf.  ) that can appear anywhere in the first few blocks of a file.

當然要知道具體的方法估計只有原始碼。

所以file -i檢測的並不一定是正確的字符集。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29734436/viewspace-2125828/,如需轉載,請註明出處,否則將追究法律責任。

相關文章