你不能這樣做,一旦你有字符串,你必須做,而你仍然有原始輸入。一旦你有了字符串,就沒有辦法自動判斷’
是否真的是有意輸入的,沒有一些嚴重脆弱的測試。例如:
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,默認情況下,只要它在給定的編碼中看到無效字節,就會拋出異常。
什麼是這裏的來源?您是否將原始數據推送到所述來源?乍看之下,我會說你嘗試並推送cp-1252撇號,而不會將它們轉換爲正確的UTF-8等價物... – fge
您需要展示如何從數據集中讀取特定數據以及如何您將向最終用戶/您自己展示特定數據。例如,你用'FileReader'來讀取它並用'System.out.println()'來表示它?您必須告訴其中一個或兩個人使用UTF-8,而不是可識別爲CP1252的平臺默認字符集。 – BalusC
這看起來像使用單字節窗口-1252編碼解碼的UTF-8數據源(U + 2019編碼正確,編碼爲字節e2 80 99)(它們被解釋爲編碼點U + 00e2 U + 20ac U + 2122 - ''™'。 – McDowell