2012-07-03 11 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, то [этот существующий вопрос] (http://stackoverflow.com/q/13144250/441108) (связанный с одним из ссылки этого вопроса) выглядит как ответ. –

ответ

5

Ваш вопрос не имеет смысла. Java String - это список символов. У них нет кодировки, пока вы не конвертируете их в байты, после чего вам нужно указать один (хотя вы увидите много кода, использующего платформу по умолчанию, что, например, String.getBytes() без аргументов).

Предлагаю вам прочитать это http://kunststube.net/encoding/.

+3

Этот ответ абсолютно правильный, но может все еще быть несколько загадочным для новичков.На самом деле вопрос: «Как определить, была ли строка закодирована с определенной кодировкой?» «Короткий ответ: пробная версия и ошибка. Вы можете настроить «CharsetDecoder», настроенный для конкретной целевой кодировки (UTF-8/ISO-8859-1 и т. Д.), И попытаться запустить вашу String через этот декодер. Если декодирование выходит из строя или генерирует исключение, вы знаете, что ваша строка содержит 1 + символы, которые не являются целевой кодировкой. Если декодер декодирует без ошибок, то вы знаете, что ваша строка соответствует критериям для этой кодировки. –

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

Я думаю, что вы проверяете только, если строка содержит символ в группе юникодов «другая буква». Но Character.getType ('ä') == Character.LOWERCASE_LETTER и Character.getType ('a') == Character.LOWERCASE_LETTER –

+0

Да, потому что я думаю, что вопрос заключается в том, как найти, что строка содержит закодированные символы или нет, и этот метод возвращает – Pooya

+0

But 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")); 
} 

Вы также можете проверить другую кодировку charset var или переместить ее в параметр.

7

Похоже, вы хотите проверить, была ли расшифрована строка, декодированная из байтов в latin1, в UTF-8. Это легко, потому что незаконные последовательности байтов заменяются символом \ ufffd:

String recoded = new String(encoded.getBytes("iso-8859-1"), "UTF-8"); 
return recoded.indexOf('\uFFFD') == -1; // No replacement character found 
Смежные вопросы