如何检查用给定的字符集正确编码字符串(不丢失信息)?
最明显的方法是转换为目标编码,解码回去并进行比较。有没有更聪明的方法?
P.S。。实际应用是对大型文本文件使用8位编码,以过滤掉在给定字符集的情况下无法编码的字符串。 (如果需要,可以将它们保存在单独的UTF-8文件中。)
天真的解决方案:
"then": false
答案 0 :(得分:0)
对于将任何编码转换为其他编码的一般情况,您建议的方法是最简单的方法。但是,如果您知道易于测试的属性,则可以更快地完成测试。例如,如果要编码为ISO-88591-1,则只需查找代码点大于0xFF的任何字符。对于ASCII,任何大于0x7F的代码点。
一个简单的正则表达式将完成这种测试。如果很容易找到一些不会翻译的代码点,您也可以使用正则表达式来测试多个字符范围。
如果此正则表达式为真:
/[^\x00-\xFF]/
任何匹配的字符串都不能无损地转换为ISO-8859-1。
对于Java,这将是Pattern.compile("[^\\x00-\\xFF]")
。
(我已经不使用Java了,而做TypeScript / JavaScript的时间已经很长了,我已经不习惯Java regex语法了!)
答案 1 :(得分:0)
通过尝试编码/解码,您可以检查字符串是否可以用特定的字符编码正确表示。
例如:
import java.io.UnsupportedEncodingException;
class Main {
public static void main(String[] args) throws UnsupportedEncodingException {
if (canBeConvertedToStringEncoding("abc", "ISO-8859-1")) {
System.out.println("can be converted");
} else {
System.out.println("cannot be converted");
}
if (canBeConvertedToStringEncoding("あいう", "ISO-8859-1")) {
System.out.println("can be converted");
} else {
System.out.println("cannot be converted");
}
}
public static boolean canBeConvertedToStringEncoding(String target, String encoding) throws UnsupportedEncodingException {
String to = new String(target.getBytes(encoding), encoding);
if (target.equals(to)) {
return true;
} else {
return false;
}
}
}