Вопрос по utf-8, encoding, character-encoding, java – Проверьте, содержит ли строка закодированные символы

2

Здравствуйте, я ищу способ обнаружить, если строка была закодирована

Например

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

Выход этогоencoded переменная:

Hellä world

Как видите, есть буква А с могилой и еще один символ. Есть ли способ проверить, содержит ли вывод закодированные символы?

Все символы закодированы. Вы пытаетесь сказать, был ли символ закодирован как два байта или больше вместо одного? Peter Lawrey
Если вы пытаетесь проверить, является ли строкаname может быть правильно закодирован в ISO-8859-1, тоthis existing question (связан с одной из ссылок этого вопроса) выглядит как ответ. Richard Barnett

Ваш Ответ

6   ответов
9

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

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

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

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

Этот ответ является абсолютно правильным, но все же может быть несколько загадочным для новичков. Вопрос, действительно, таков:How can I tell if a String has been encoded with a certain encoding?& Quot; Краткий ответ: метод проб и ошибок. Вы можете настроитьCharsetDecoder сконфигурирован для конкретной целевой кодировки (UTF-8 / ISO-8859-1 и т. д.) и попытайтесь запустить вашу строку через этот декодер. Если при декодировании происходит сбой или возникает исключение, вы знаете, что ваша строка содержит 1+ символов, которые не соответствуют целевой кодировке. Если декодер декодирует без ошибок, то вы знаете, что ваша строка соответствует критериям для этой кодировки.
4

Если я правильно понял ваш вопрос, этот код может вам помочь. Функция 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"));
}

Вы также можете проверить, не изменяет ли другой набор символов переменную набора символов или перемещает ее в параметр.

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;
}
Да, потому что я думаю, что вопрос в том, как найти, что строка содержит закодированные символы или нет, и этот метод возвращает это
Я думаю, что вы тестируете, только если строка содержит символ в «другой букве» группа юникод. Но Character.getType ("& # xE4;") == Character.LOWERCASE_LETTER и Character.getType ("a") == Character.LOWERCASE_LETTER
Но Character.getType ("& # xE4;") == Character.LOWERCASE_LETTER и Character.getType (& apos; & # xE4; & apos;)! = Character.OTHER_LETTER, поэтому ваш код не работает. Character.OTHER_LETTER не содержит все символы Юникода, только определенную подгруппу.
Не работа ........
5
String name = "Hellä world";
String encoded = new String(name.getBytes("utf-8"), "iso8859-1");

Этот код - просто ошибка искажения символов. Вы берете строку UTF-16, перекодируете ее в UTF-8, притворяетесь, что это ISO-8859-1, и перекодируете ее обратно в UTF-16, что приводит к неправильно закодированным символам.

Похожие вопросы