2009-02-26 51 views
2

我有一堆包含主要ISO-8859-1和UTF-8編碼的文件。查找文件ISO-8859-1編碼?

我想使所有文件UTF-8,但是當試圖使用 iconv對這些文件進行批量編碼時,會出現一些問題。 (文件削減了一半,等)

我supposse原因是的iconv要求「和」 encoding知道,所以如果命令看起來像這樣

iconv -f ISO-8859-1 -t UTF-8 in.php -o out.php 

但「in.php」如果已經UTF-8編碼,導致問題(糾正我,如果我錯了)

有沒有辦法,我可以列出所有的編碼不是UTF-8的文件?

回答

4

您無法找到明確是ISO-8859-1的文件,但可以找到有效的UTF-8文件(與大多數多字節編碼不同,它可以合理地確保它們實際上是UTF- 8)。 moreutils有一個工具isutf8它可以爲你做到這一點。或者你可以自己寫,這會很簡單。

0

什麼樣的內容? XML?那麼是的,如果在頂部正確標記。通用文本文件?我不知道有什麼先驗的方法來知道使用什麼編碼,雖然它有可能,有時候,聰明的代碼。 「標記」UTF-8文本文件,我的意思是UTF-8文本文件與Byte-Order mark? (對於UTF-8,三字節序列「ï¿¿」)可能。字節順序標記字符不會通常顯示爲ISO-8859-1編碼文件中的前三個字符。 (其中bobince在這篇文章的評論中指出,所以我正在糾正我的帖子。)

出於您的目的,存在的工具可能可以解決您的大部分問題。洛根卡帕爾多指出在his answer之一。但是畢竟,如果始終可以明確地知道文件中使用了什麼字符編碼,那麼iconv實用程序不需要您提供「from」編碼。 :)

+0

UTF-8文件不應該,「正常」,有一個BOM(雖然在實踐中,他們經常這樣做。而一個UTF-8編碼的BOM可以非常清楚的存在ISO-8859-1文件的開頭(這意味着「ï¿¿」)......當然,這不太可能。 – bobince 2009-02-26 12:06:00

2

通過閱讀文本文件來判斷它是否使用UTF-8編碼通常很困難。您可以掃描文件中某些indicator bytes,這在UTF-8中永遠不會發生,並且如果找到它們,則知道該文件在ISO-8859-1中。如果你發現一個字節的高位被設置,緊接在它之前和之後的字節沒有設置高位,你就知道它是ISO編碼的(因爲字節> 127總是以UTF序列出現-8)。除此之外,它基本上是猜測 - 您必須查看具有該高位集的字節序列,並查看它們是否對ISO-8859-1發生有意義。

file程序會嘗試猜測它正在處理的文本文件的編碼,你可以試試。

1

有沒有辦法,我可以列出所有的編碼不是UTF-8的文件?

在bash中也許並不那麼容易,但它是一個微不足道的任務。的Python:

import os.path 

for child in os.path.listdir(TARGETDIR): 
    child= os.path.join(TARGETDIR, child) 
    if os.path.isfile(child): 
     content= open(child, 'rb').read() 

     try: 
      unicode(content, 'utf-8') 
     except UnicodeDecodeError: 
      open(child, 'wb').write(unicode(content, 'iso-8859-1')) 

這假設是可以被解釋爲有效的UTF-8序列任何文件一個(等都可以單獨留在家中),而任何不必須是ISO- 8859-1。

這是一個合理的假設,如果這兩個是唯一可能的編碼,因爲有效的UTF-8序列(特定順序中至少有兩個頂級位集字符)在實際拉丁文本中相對較少,往往只使用奇怪的單重音字符在這裏和那裏。

0

與發現它很簡單

find . -print0 | xargs -0 file | grep 8859