将 UTF-8 字符更改为 Latin1 Java

Change UTF-8 character to Latin1 Java

在我的项目中,我从我的数据库中读取了字符串,由于权限原因,我无法在其中进行任何更改。我在任何编码中使用一个字符串,然后将它更改为 UTF-8 没有任何问题,例如:

String countryName= "ESPAÑA";   //get from de DataBase in unkwon encode
String utf8 = new String(myString.getBytes(), Charset.forName("UTF-8"));
System.out.println(utf8); //prints -> ESPAÑA and it should be ESPAÑA

我需要更改它,将所有解析为 UTF-8 的字符串转换为 Latin1

我在该页面中找到了很多方法,但任何方法都正确无误。

String#getBytes() returns 文本作为使用系统编码的字节。您需要的是一个包含每个字符值的字节数组,无需进行任何转换以保持 UTF8 编码。你可以通过调用

来做到这一点
myString.getBytes("8859_1");

所以你的代码行应该改成

String utf8 = new String(myString.getBytes("8859_1"), "UTF8");

但这只是一种解决方法。您之前应该做的是检查对数据库的访问,因为从中选择数据时数据应该以这种方式出现。作为第一个测试,使用常规的 DB 客户端并查看文本是否在其中正确显示。如果是这种情况,则 table 包含正确的数据,并且您从数据库中检索的数据有问题。这可能是连接字符串中的错误字符集设置,或者您没有使用 resultset#getString() 将数据作为文本获取,但也许您将其作为字节数组获取并以错误的方式创建字符串。

尝试找到问题的根源并解决问题。那么你不需要像上面那样的黑客来获得正确的数据。

如果您不知道原始字节的编码,则无法将它们转码为已知格式。我为 Unicode 联盟写了一篇关于这个问题的论文。见 Mapping Text in Unspecified Character Sets to Unicode as a Canonical Representation in a Hostile Environment

这段代码 新字符串(myString.getBytes(),Charset.forName("UTF-8") 意思是,我有 UTF-8 格式的字节,将它们转换成 Java 字符串。

UTF-8可以支持全范围的Unicode字符(目前大约2^21)。 Latin 1 只能支持 2^8 个字符。

因此,从 UTF-8 转码为 Latin-1 是危险的,因为会丢失一些字符,您将需要丢失字符异常处理。

从 Latin-1 转码到 UTF-8 没问题,因为 UTF-8 支持 Latin-1 中的所有字符。