2013-01-09 69 views
18

在一個大型數據集,我有一些數據,看起來像這樣:如何驗證是否UTF-8字符串包含MAL-編碼字符

"guide (but, yeah, it’s okay to share it with ‘em)." 

我已經打開文件中的十六進制編輯器和運行原始字節數據通過字符編碼檢測算法(http://code.google.com/p/juniversalchardet/),並且它被肯定檢測爲UTF-8。

在我看來,數據的來源錯誤地解釋了原始字符集並且寫了有效的UTF-8作爲我收到的輸出。

我想盡可能驗證數據。是否有任何啓發式算法可以幫助我刺探驗證?

+1

什麼是這裏的來源?您是否將原始數據推送到所述來源?乍看之下,我會說你嘗試並推送cp-1252撇號,而不會將它們轉換爲正確的UTF-8等價物... – fge

+0

您需要展示如何從數據集中讀取特定數據以及如何您將向最終用戶/您自己展示特定數據。例如,你用'FileReader'來讀取它並用'System.out.println()'來表示它?您必須告訴其中一個或兩個人使用UTF-8,而不是可識別爲CP1252的平臺默認字符集。 – BalusC

+0

這看起來像使用單字節窗口-1252編碼解碼的UTF-8數據源(U + 2019編碼正確,編碼爲字節e2 80 99)(它們被解釋爲編碼點U + 00e2 U + 20ac U + 2122 - ''™'。 – McDowell

回答

34

你不能這樣做,一旦你有字符串,你必須做,而你仍然有原始輸入。一旦你有了字符串,就沒有辦法自動判斷’是否真的是有意輸入的,沒有一些嚴重脆弱的測試。例如:

public static boolean isUTF8MisInterpreted(String input) { 
      //convenience overload for the most common UTF-8 misinterpretation 
      //which is also the case in your question 
     return isUTF8MisInterpreted(input, "Windows-1252"); 
} 

public static boolean isUTF8MisInterpreted(String input, String encoding) { 

    CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder(); 
    CharsetEncoder encoder = Charset.forName(encoding).newEncoder(); 
    ByteBuffer tmp; 
    try { 
     tmp = encoder.encode(CharBuffer.wrap(input)); 
    } 

    catch(CharacterCodingException e) { 
     return false; 
    } 

    try { 
     decoder.decode(tmp); 
     return true; 
    } 
    catch(CharacterCodingException e){ 
     return false; 
    }  
} 

public static void main(String args[]) { 
    String test = "guide (but, yeah, it’s okay to share it with ‘em)."; 
    String test2 = "guide (but, yeah, it’s okay to share it with ‘em)."; 
    System.out.println(isUTF8MisInterpreted(test)); //true 
    System.out.println(isUTF8MisInterpreted(test2)); //false 

} 

如果您仍然可以訪問原始輸入,你可以看到,如果一個字節數組金額與此完全有效的UTF-8字節序列:

public static boolean isValidUTF8(byte[] input) { 

    CharsetDecoder cs = Charset.forName("UTF-8").newDecoder(); 

    try { 
     cs.decode(ByteBuffer.wrap(input)); 
     return true; 
    } 
    catch(CharacterCodingException e){ 
     return false; 
    }  
} 

您也可以使用帶有流的CharsetDecoder,默認情況下,只要它在給定的編碼中看到無效字節,就會拋出異常。

+0

這是迄今爲止我發現的最簡單的解決方案。謝謝! – Chepech

-4

如果您使用HTML5則只需添加 <meta charset="UTF-8"><head>

內對HTML4 <meta http-equiv="Content-type" content="text/html;charset=UTF-8">

相關問題