2010-06-30 45 views

回答

7

的iconv也許能告訴你,如果事情是不是UTF-8,但其他的編碼可能不那麼容易(尤其是8位單字節編碼,如ISO-8859-1)。

對於Git,您實際上可能需要一個更新掛鉤而不是預先提交掛鉤(以便它可以在中央存儲庫中運行以強制執行規則)。

GIT中pre-commit鉤子:

#!/bin/sh 
git ls-files -z -- | 
xargs -0 sh -c ' 

    e="" 
    for f; do 
     if ! git show :"$f" | 
      iconv -f UTF-8 -t UTF-8 >/dev/null 2>&1; then 
      e=1 
      echo "Not UTF-8: $f" 
      #exit 255 # to abort after first non-UTF-8 file 
     fi 
    done 
    test -z "$e" 

' - 

將一個或多個GIT中pathspecs上git的LS-文件--命令行之後,以限制檢查的路徑名。

要檢查更新ref的尖端在更新鉤,使用git ls-tree --name-only -r -z $3 -- |以生成路徑名(注意:它不處理圖案pathspecs像GIT中LS-文件,所以做任何基於模式的濾波在殼代碼)和git show "$3:$f"來提取文件內容。您可能還需要檢查提示提交,但不要只檢查每個新提交(每個提交在git rev-list ^$2 $3而不是僅限於$3)的循環。

4

預提交掛鉤只是腳本的問題。因此,如果您可以在腳本中說明編碼,則可以使用該信息拒絕錯誤的文件類型。

您可以在文件中搜索正常字符範圍之外的字符。如果有一個幻數或標籤告訴你文件的編碼,你可以檢查。否則問自己「我怎麼知道這個文件是錯誤的編碼?」你可以編碼嗎?

2

您也許可以使用iconv實用程序將編碼從UTF-8更改爲例如UTF-16。而如果更改​​失敗,源文件是不是在正確的編碼:

$ iconv -f UTF-8 -t UTF-16 Strings.java 
ÿþ 
testing = iconv: illegal input sequence at position 11 
相關問題