检查字符串是否包含编码字符

5

你好,我正在寻找一种检测字符串是否被编码的方法。

例如:

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

这个encoded变量的输出结果是:
Hellä world

如您所见,有一个带重音符号的A以及另一个符号。是否有办法检查输出是否包含编码字符?


3
所有字符都被编码了。你是想判断一个字符是否被编码成了两个或更多字节,而不是一个吗? - Peter Lawrey
如果您正在尝试检查字符串name是否可以正确编码为ISO-8859-1,则此现有问题(从本问题的链接中链接)似乎是答案。 - Richard Barnett
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

5
您的问题不太明确。Java中的String是一串字符,它们在转换为字节之前没有编码方式。当您将它们转换为字节时,需要指定编码方式(虽然您会看到很多使用平台默认编码方式的代码,例如没有参数的String.getBytes())。
我建议您阅读这篇文章:http://kunststube.net/encoding/

4
这个答案是完全正确的,但对于新手来说可能仍然有点晦涩。实际上问题是“如何判断一个字符串是否已经用某种编码进行了编码?”简短的答案是:通过试错。您可以设置一个CharsetDecoder以特定目标编码(UTF-8/ISO-8859-1等)进行配置,并尝试将您的字符串通过该解码器运行。如果解码失败或引发异常,则意味着您的字符串包含一个或多个不是该目标编码的字符。如果解码器能够无错误地解码,则表明您的字符串符合该编码的条件。 - user1768830

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

这段代码仅是一个字符损坏的漏洞。你将一个UTF-16字符串转码为UTF-8,假装它是ISO-8859-1,并将其转码回UTF-16,导致字符编码不正确。


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

您还可以检查其他字符集,更改字符集变量或将其移动到参数中。


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
我认为你只是在测试字符串是否包含“其他字母”Unicode组中的字符。但是Character.getType('ä') == Character.LOWERCASE_LETTER和Character.getType('a') == Character.LOWERCASE_LETTER。 - Andrea Parodi
是的,因为我认为问题在于如何找到一个字符串是否包含编码字符,而这种方法返回了这一点。 - Pooya
但是 Character.getType('ä') == Character.LOWERCASE_LETTER 并且 Character.getType('ä') != Character.OTHER_LETTER,所以你的代码不起作用。Character.OTHER_LETTER 不包含所有 Unicode 字符,只包含特定的子组。 - Andrea Parodi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接