在DataInputStream中读取大于UnsignedShort.MAX_VALUE的UTF字符串

时间:2014-10-27 21:25:57

标签: java utf-8 decoding

据我所知,DataInputStream是使用Modified-UTF8反序列化字符串的唯一方法。不幸的是,String的大小有限,因为长度是无符号的短。

使用Modified-UTF8的主要动机是Java 8不再允许3字节代理/ 6字节代理对,因此以下代码无法正常运行(在带有这些代理的字符串上):

String surrogatePairs = "\uD83C\uDFE0\uD83C\uDF4E\uD83D\uDCA9";

// Serialization process using 3-byte surrogates

String deserialized = new String(bytes, "UTF-8");
assertEquals(surrogatePairs, deserialized); // fails

但是,此代码可以正常运行:

ByteBuffer bb = ByteBuffer.allocate(len + 2);
bb.putShort((short) len).put(nonNullValue, offset, len);

ByteArrayInputStream bis = new ByteArrayInputStream(bb.array());
DataInputStream dis = new DataInputStream(bis);

assertEquals(surrogatePairs, dis.readUTF()); // OK

这种方法的问题在于对String的大小没有限制,因此如果String的长度超过unsigned short的长度,它将无法正常工作。

是否有另一种方法可以使用3字节代理项/ 6字节代理项对对字符串进行反序列化?编码的数据被保证为UTF-8,如果它解决了字符串超过Integer.MAX_VALUE / 2的任何问题。

0 个答案:

没有答案