你好,我正在寻找一种检测字符串是否被编码的方法。
例如:
String name = "Hellä world";
String encoded = new String(name.getBytes("utf-8"), "iso8859-1");
这个
encoded
变量的输出结果是:Hellä world
如您所见,有一个带重音符号的A以及另一个符号。是否有办法检查输出是否包含编码字符?
你好,我正在寻找一种检测字符串是否被编码的方法。
例如:
String name = "Hellä world";
String encoded = new String(name.getBytes("utf-8"), "iso8859-1");
encoded
变量的输出结果是:Hellä world
如您所见,有一个带重音符号的A以及另一个符号。是否有办法检查输出是否包含编码字符?
看起来你想要检查一个从latin1解码的字符串是否也可以用UTF-8编码,这很容易因为非法字节序列会被字符\ufffd替换:
String recoded = new String(encoded.getBytes("iso-8859-1"), "UTF-8");
return recoded.indexOf('\uFFFD') == -1; // No replacement character found
String
是一串字符,它们在转换为字节之前没有编码方式。当您将它们转换为字节时,需要指定编码方式(虽然您会看到很多使用平台默认编码方式的代码,例如没有参数的String.getBytes()
)。CharsetDecoder
以特定目标编码(UTF-8/ISO-8859-1等)进行配置,并尝试将您的字符串通过该解码器运行。如果解码失败或引发异常,则意味着您的字符串包含一个或多个不是该目标编码的字符。如果解码器能够无错误地解码,则表明您的字符串符合该编码的条件。 - user1768830String name = "Hellä world";
String encoded = new String(name.getBytes("utf-8"), "iso8859-1");
这段代码仅是一个字符损坏的漏洞。你将一个UTF-16字符串转码为UTF-8,假装它是ISO-8859-1,并将其转码回UTF-16,导致字符编码不正确。
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"));
}
您还可以检查其他字符集,更改字符集变量或将其移动到参数中。
String encoded = new String(name.getBytes("utf-8"), "iso8859-1");
name
编码为"UTF-8",然后尝试解码为"iso8859-1"。name
编码为"iso8859-1",只需执行name.getBytes("iso8859-1")
。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;
}
name
是否可以正确编码为ISO-8859-1,则此现有问题(从本问题的链接中链接)似乎是答案。 - Richard Barnett