包含哈瓦那 (UTF-8) 的 XML 被发送到服务 A。
服务 A 将其发送给服务 B。
该字符串被编码为 哈甦那 (ISO-8859-1)。
我如何将它编码回哈瓦那?考虑到 Java 中的所有字符串都是 UTF-16。服务 B 必须将其比较为哈瓦那而不是 哈甦那。
谢谢。
包含哈瓦那 (UTF-8) 的 XML 被发送到服务 A。
服务 A 将其发送给服务 B。
该字符串被编码为 哈甦那 (ISO-8859-1)。
我如何将它编码回哈瓦那?考虑到 Java 中的所有字符串都是 UTF-16。服务 B 必须将其比较为哈瓦那而不是 哈甦那。
谢谢。
当您读取文本文件时,您必须使用用于创建文件的实际编码来读取它。如果您指定适当的编码,您将在内存中获得正确的字符。因此,如果相同的文件(语义上)存在于两个版本(UTF-8 编码和 ISO-8859-1)中,则使用 UTF-8 读取第一个文件,使用 ISO-8859-1 读取第二个文件将导致完全相同内存中的字符。
只有首先在 ISO-8859-1 中对文件进行编码是有意义的,上述情况才是正确的。UTF-8 能够存储每个 unicode 字符。但 ISO-8859-1 只能编码一小部分 unicode 字符(西方语言字符)。您发布的字符在我看来就像中文,而且我认为在 ISO-8859-1 中对它们进行编码甚至都不可能丢失所有内容。
我认为您误诊了问题:
包含哈瓦那 (UTF-8) 的 XML 被发送到服务 A。
好的 ...
服务 A 将其发送给服务 B。
好的 ...
该字符串被转换为 哈甦那 (ISO-8859-1)。
这是不正确的。该字符串尚未“转换”。相反,它是用错误的字符编码解码的。具体来说,它看起来很像采用 UTF-8 编码的字节,并假设它们是 ISO-8859-1 编码的,并相应地对其进行解码。
你能解开这个吗?这取决于错误解码首先发生的位置。如果它发生在服务 B 中,那么您应该能够将数据源重新标记为 UTF-8,然后正确解码。另一方面,如果第一个错误解码发生在服务 A 中,那么您可能会很不走运。错误的解码可能会导致数据丢失,因为无法识别的代码会被其他字符替换。如果发生这种情况,原始数据将永远消失。
无论哪种情况,解决此问题的最佳方法是找出混淆了错误字符编码的原因,然后修复它。也许需要修复 XML 以指定字符集/编码。或许,需要更正传输机制(例如 HTTP 请求或响应)以包含正确的文档编码。
使用 writer 和 reader 编码/解码您的输入/输出流:
String yourText = "...";
InputStream yourInputStream = ...;
Writer out = new OutputStreamWriter(youInputStream, "UTF-8");
out.write(yourText);
读者也一样。