我调用一个库方法,该方法返回一个可序列化类型的对象。 在大多数情况下,该值是一个简单的String,因此我将返回的值强制转换为String。 我执行以下操作来检索字符串:
String val = (String)data.get("MyString");
但是,当检索到的字符串包含非ASCII时会出现问题。 例如,“Køllert”,返回的值显示为“ KxF8llert” ø用xF8代替,xF8是相应的Unicode十六进制值。
当我将值打印为字节时,字符打印为-8。
byte[] defaultBytes = val.getBytes();
for(int ii=0; ii<defaultBytes.length; ii++) print((int)defaultBytes[ii]);
有没有一种方法可以“清除”返回的字符串以使其可以作为标准Unicode打印,从而正确显示该字符。
当我按如下方式输入实际字符串时,可以正确打印该字符串,并且在检查字节时,该字符占用两个字节,其整数值为-61和-72。也许它返回的是UTF-8而不是Unicode? p>
String val1 = "Køllert";
byte[] defaultBytes1 = val1.getBytes();
for(int ii=0; ii<defaultBytes1.length; ii++) print((int)defaultBytes1[ii]);
很抱歉,这个问题可能含糊不清。 以下似乎对我有用。它不是那么复杂,但是让我旋转。
String val = new String(data.get("MyString").getBytes("UTF-8"));
答案 0 :(得分:1)
也许它返回的是UTF-8而不是Unicode? p>
串行化产生一个字节流。将Java字符串(一种以UTF-16形式存储的Unicode字符序列)转换为字节流的一种明显,经济且无损的方法是将其转换为以UTF-8形式存储的Unicode字符序列。 / p>
(UTF-16和UTF-8是Unicode的有效表示形式)
鉴于存在将String转换为序列化形式的情况,所以不能跳过将序列化形式反向转换为String的情况。
为什么您以前进行序列化时都没有反向转换?
如果我们正确地猜想序列化的格式为UTF-8,则可以使用String(data.get(whatever))
来转换为String。如果不是UTF-8,则是序列化代码的内部事务,并且大概提供了互补的解串器。
无论如何,您不能仅仅声称拥有的已经是String(即强制转换)来进行数据转换。
答案 1 :(得分:1)
我将评论作为答案,因为它似乎很有帮助。
正如我在上面的评论中所述,您可能想事先知道bytearray
的字节元素将存储什么编码。
因此而不是stringObject.getBytes()
-它使用平台的默认字符集将您的字符串编码为字节序列,并将结果存储到新的字节数组中,
您可能想使用
stringObject.getBytes("character-encoding")
-使用给定的character-encoding
将您的字符串编码为字节序列,并将结果存储到新的字节数组中。
您似乎应该使用上述版本的第二个版本,因为它将编码您的字符串into the given encoding。