gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:59:04 26 4
gpt4 key购买 nike

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

显而易见的方法是转换为目标编码,解码回来并进行比较。有更聪明的方法吗?

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

简单的解决方案:

import java.nio.charset.Charset;

public class NaiveCharsetValidatation {
public static void main(String[] args) {
Charset targetCharset = Charset.forName("iso-8859-1");

byte[] bytes = "ภาษาไทย".getBytes(targetCharset);

String decodedString = new String(bytes, targetCharset);

System.out.println(decodedString); // outputs ???????
}
}

最佳答案

对于任何编码到任何其他编码的一般情况,您提出的方法是最直接的方法。但是,如果您知道易于测试的属性,则测试可以更快地完成。例如,如果您想编码为 ISO-88591-1,您可以简单地查找代码点大于 0xFF 的任何字符。对于 ASCII,任何大于 0x7F 的代码点。

一个简单的正则表达式就可以完成这种测试。如果很容易找到一些无法翻译的代码点范围,您还可以使用正则表达式来测试多个字符范围。

如果此正则表达式为 true:

/[^\x00-\xFF]/

任何匹配的字符串都无法无损地转换为 ISO-8859-1。

对于 Java 来说,这就是 Pattern.compile("[^\\x00-\\xFF]")

(我已经不再使用 Java 而是使用 TypeScript/JavaScript 太久了,我已经不再习惯 Java 正则表达式语法了!)

关于Java:检查字符串是否可以使用给定的字符集正确编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57061725/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com