你好,我正在尋找一種方式,如果一個字符串已經被編碼檢查如果字符串包含編碼的字符
例如
String name = "Hellä world";
String encoded = new String(name.getBytes("utf-8"), "iso8859-1");
這個encoded
變量的輸出是檢測:
Hellä world
正如你所看到的那樣,有一個帶有墳墓和另一個符號的A.有沒有辦法檢查輸出是否包含編碼字符?
你好,我正在尋找一種方式,如果一個字符串已經被編碼檢查如果字符串包含編碼的字符
例如
String name = "Hellä world";
String encoded = new String(name.getBytes("utf-8"), "iso8859-1");
這個encoded
變量的輸出是檢測:
Hellä world
正如你所看到的那樣,有一個帶有墳墓和另一個符號的A.有沒有辦法檢查輸出是否包含編碼字符?
你的問題沒有意義。 java String
是一個字符列表。他們沒有編碼,直到你將它們轉換爲字節,此時你需要指定一個編碼(儘管你會看到很多使用平臺默認的代碼,例如String.getBytes()
沒有參數)。我建議你閱讀這個http://kunststube.net/encoding/。
這個答案是絕對正確的,但對於新手來說可能仍然有點神祕。這個問題實際上是「*如何判斷一個字符串是否使用了某種編碼進行編碼?*」簡短的回答是:試錯法。您可以設置爲特定目標編碼(UTF-8/ISO-8859-1等)配置的「CharsetDecoder」,並嘗試通過該解碼器運行您的字符串。如果解碼失敗或拋出異常,您知道您的字符串包含1個以上不是目標編碼的字符。如果解碼器沒有錯誤地解碼,那麼你知道你的String符合該編碼的標準。 – 2013-08-27 12:44:19
String name = "Hellä world";
String encoded = new String(name.getBytes("utf-8"), "iso8859-1");
此代碼只是一個字符損壞的錯誤。您採用UTF-16字符串,將其轉碼爲UTF-8,假裝爲ISO-8859-1並將其轉碼回UTF-16,導致編碼字符不正確。
我不太確定你想要做什麼或者你的問題是什麼。
此行沒有任何意義:
String encoded = new String(name.getBytes("utf-8"), "iso8859-1");
您編碼您name
爲「UTF-8」,然後試圖解碼爲「ISO8859-1」。
如果您將name
編碼爲「iso8859-1」,只需執行name.getBytes("iso8859-1")
即可。
請告訴我們您遇到的問題是什麼,以便我們能夠提供更多幫助。
你可以檢查你的字符串是由這個代碼
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;
}
我想你只是測試如果字符串在「其他字母」unicode組中包含字符。但是,Character.getType('ä')== Character.LOWERCASE_LETTER和Character.getType('a')== Character.LOWERCASE_LETTER –
是的,因爲我認爲問題是如何找到一個字符串包含編碼的字符或不,此方法返回 – Pooya
但Character.getType('ä')== Character.LOWERCASE_LETTER和Character.getType('ä')!= Character.OTHER_LETTER,因此您的代碼不起作用。 Character.OTHER_LETTER不包含所有的Unicode字符,只包含特定的子組。 –
編碼或不是如果我理解正確你的問題,這個代碼可以幫助你。函數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或將它移動到一個參數。
聽起來就像你想檢查一個字符串是否可以在UTF-8中解碼。這很容易,因爲非法字節序列被替換爲字符\ ufffd:
String recoded = new String(encoded.getBytes("iso-8859-1"), "UTF-8");
return recoded.indexOf('\uFFFD') == -1; // No replacement character found
所有字符都被編碼。你是否試圖告訴一個字符是否被編碼爲兩個字節或更多而不是一個? –
如果您試圖檢查字符串'name'是否可以在ISO-8859-1中正確編碼,那麼[this existing question](http://stackoverflow.com/q/13144250/441108)(鏈接自這個問題的鏈接)看起來像答案。 –