Java:检查字符串是否可以使用给定的字符集正确编码?

时间:2019-07-16 16:26:37

标签: java encoding character-encoding

如何检查用给定的字符集正确编码字符串(不丢失信息)?

最明显的方法是转换为目标编码,解码回去并进行比较。有没有更聪明的方法?

P.S。。实际应用是对大型文本文件使用8位编码,以过滤掉在给定字符集的情况下无法编码的字符串。 (如果需要,可以将它们保存在单独的UTF-8文件中。)

天真的解决方案:

"then": false

2 个答案:

答案 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;
    }
  }
}