2012-07-03 155 views
0

你好,我正在尋找一種方式,如果一個字符串已經被編碼檢查如果字符串包含編碼的字符

例如

String name = "Hellä world"; 
    String encoded = new String(name.getBytes("utf-8"), "iso8859-1"); 

這個encoded變量的輸出是檢測:

Hellä world 

正如你所看到的那樣,有一個帶有墳墓和另一個符號的A.有沒有辦法檢查輸出是否包含編碼字符?

+3

所有字符都被編碼。你是否試圖告訴一個字符是否被編碼爲兩個字節或更多而不是一個? –

+0

如果您試圖檢查字符串'name'是否可以在ISO-8859-1中正確編碼,那麼[this existing question](http://stackoverflow.com/q/13144250/441108)(鏈接自這個問題的鏈接)看起來像答案。 –

回答

5

你的問題沒有意義。 java String是一個字符列表。他們沒有編碼,直到你將它們轉換爲字節,此時你需要指定一個編碼(儘管你會看到很多使用平臺默認的代碼,例如String.getBytes()沒有參數)。我建議你閱讀這個http://kunststube.net/encoding/

+3

這個答案是絕對正確的,但對於新手來說可能仍然有點神祕。這個問題實際上是「*如何判斷一個字符串是否使用了某種編碼進行編碼?*」簡短的回答是:試錯法。您可以設置爲特定目標編碼(UTF-8/ISO-8859-1等)配置的「CharsetDecoder」,並嘗試通過該解碼器運行您的字符串。如果解碼失敗或拋出異常,您知道您的字符串包含1個以上不是目標編碼的字符。如果解碼器沒有錯誤地解碼,那麼你知道你的String符合該編碼的標準。 – 2013-08-27 12:44:19

5
String name = "Hellä world"; 
String encoded = new String(name.getBytes("utf-8"), "iso8859-1"); 

此代碼只是一個字符損壞的錯誤。您採用UTF-16字符串,將其轉碼爲UTF-8,假裝爲ISO-8859-1並將其轉碼回UTF-16,導致編碼字符不正確。

3

我不太確定你想要做什麼或者你的問題是什麼。

此行沒有任何意義:

String encoded = new String(name.getBytes("utf-8"), "iso8859-1"); 

您編碼您name爲「UTF-8」,然後試圖解碼爲「ISO8859-1」。

如果您將name編碼爲「iso8859-1」,只需執行name.getBytes("iso8859-1")即可。

請告訴我們您遇到的問題是什麼,以便我們能夠提供更多幫助。

0

你可以檢查你的字符串是由這個代碼

public boolean isEncoded(String input) { 

    char[] charArray = input.toCharArray(); 
    for (int i = 0, charArrayLength = charArray.length; i < charArrayLength; i++) { 
     Character c = charArray[i]; 
     if (Character.getType(c) == Character.OTHER_LETTER)){ 
      return true; 
     } 
    } 
    return false; 
} 
+1

我想你只是測試如果字符串在「其他字母」unicode組中包含字符。但是,Character.getType('ä')== Character.LOWERCASE_LETTER和Character.getType('a')== Character.LOWERCASE_LETTER –

+0

是的,因爲我認爲問題是如何找到一個字符串包含編碼的字符或不,此方法返回 – Pooya

+0

但Character.getType('ä')== Character.LOWERCASE_LETTER和Character.getType('ä')!= Character.OTHER_LETTER,因此您的代碼不起作用。 Character.OTHER_LETTER不包含所有的Unicode字符,只包含特定的子組。 –

3

編碼或不是如果我理解正確你的問題,這個代碼可以幫助你。函數isEncoded檢查其參數是否可以ascii編碼或者是否包含非ASCII字符。

public boolean isEncoded(String text){ 

    Charset charset = Charset.forName("US-ASCII"); 
    String checked=new String(text.getBytes(charset),charset); 
    return !checked.equals(text); 

} 

@Test 
public void testAscii() throws Exception{ 
    Assert.assertFalse(isEncoded("Hello world")); 
} 


@Test 
public void testNonAscii() throws Exception{ 
    Assert.assertTrue(isEncoded("Hellä world")); 
} 

您還可以檢查其他字符集字符集改變VAR或將它移動到一個參數。

7

聽起來就像你想檢查一個字符串是否可以在UTF-8中解碼。這很容易,因爲非法字節序列被替換爲字符\ ufffd:

String recoded = new String(encoded.getBytes("iso-8859-1"), "UTF-8"); 
return recoded.indexOf('\uFFFD') == -1; // No replacement character found 
相關問題