4

こんにちは、文字列がエンコードされているかどうかを検出する方法を探しています

例えば

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

このencoded変数の出力は次のとおりです。

Hellä world

ご覧のとおり、墓のある A と別の記号があります。出力にエンコードされた文字が含まれているかどうかを確認する方法はありますか?

4

6 に答える 6

14

latin1 のバイトからデコードされた文字列が UTF-8 でもデコードされたかどうかを確認したいようです。不正なバイト シーケンスは文字 \ufffd に置き換えられるため、これは簡単です。

String recoded = new String(encoded.getBytes("iso-8859-1"), "UTF-8");
return recoded.indexOf('\uFFFD') == -1; // No replacement character found
于 2012-07-03T12:14:49.770 に答える
5

Your question doesn't make sense. A java String is a list of characters. They don't have an encoding until you convert them into bytes, at which point you need to specify one (although you will see a lot of code that uses the platform default, which is what e.g. String.getBytes() with no argument does).

I suggest you read this http://kunststube.net/encoding/.

于 2012-07-03T10:39:09.320 に答える
5
String name = "Hellä world";
String encoded = new String(name.getBytes("utf-8"), "iso8859-1");

This code is just a character corruption bug. You take a UTF-16 string, transcode it to UTF-8, pretend it is ISO-8859-1 and transcode it back to UTF-16, resulting in incorrectly encoded characters.

于 2012-07-03T10:39:34.087 に答える
5

あなたの質問を正しく理解していれば、このコードが役立つかもしれません。関数 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 を変更したり、パラメーターに移動したりして、他の文字セットを確認することもできます。

于 2012-07-03T11:11:23.293 に答える
3

あなたが何をしようとしているのか、何が問題なのか、よくわかりません。

この行は意味がありません:

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

name「UTF-8」にエンコードしてから、「iso8859-1」としてデコードしようとしています。

name「iso8859-1」としてエンコードする場合は、 name.getBytes("iso8859-1").

さらにサポートできるように、発生した問題を教えてください。

于 2012-07-03T10:44:22.110 に答える
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;
}
于 2012-07-03T10:50:21.643 に答える