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

你的问题没有意义。javaString是一个字符列表。在您将它们转换为字节之前,它们没有编码,此时您需要指定一个(尽管您会看到很多使用平台默认值的代码,例如String.getBytes()没有参数的情况)。

我建议您阅读此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");

此代码只是一个字符损坏错误。您获取一个 UTF-16 字符串,将其转码为 UTF-8,假装它是 ISO-8859-1 并将其转码回 UTF-16,从而导致编码错误的字符。

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

您还可以检查其他字符集更改字符集 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 回答