说"Java Modified UTF-8 Encoding"是什么意思?它与普通的UTF-8编码有什么不同?
Bal*_*usC 11
这在javadoc中有详细描述DataInput:
修改了UTF-8
DataInput和和DataOutput接口的实现表示Unicode字符串,其格式是对UTF-8的略微修改.(有关标准UTF-8格式的信息,请参见3.9 Unicode标准的Unicode编码格式,版本4.0).请注意,在下表中,最重要的位出现在最左侧的列中....(有些表,请点击javadoc链接查看自己)...
此格式与标准UTF-8格式之间的差异如下:
- 空字节
'\u0000'以2字节格式而不是1字节编码,因此编码的字符串永远不会嵌入空值.- 仅使用1字节,2字节和3字节格式.
- 补充字符以代理对的形式表示.
如何阅读它在javadoc中详细描述DataInput#readUTF():
的readUTF
Run Code Online (Sandbox Code Playgroud)String readUTF() throws IOException读入使用修改的UTF-8格式编码的字符串.一般合同
readUTF是它读取以修改的UTF-8格式编码的Unicode字符串的表示; 然后将此字符串作为a返回String.首先,读取两个字节并用于以与
readUnsignedShort方法完全相同的方式构造无符号的16位整数.此整数值称为UTF长度,并指定要读取的其他字节数.然后通过将它们分组考虑将这些字节转换为字符.每个组的长度是从组的第一个字节的值计算的.组之后的字节(如果有)是下一组的第一个字节.如果组的第一个字节与位模式匹配
0xxxxxxx(其中x"可能是0或1"),则该组仅由该字节组成.该字节被零扩展以形成一个字符.如果组的第一个字节与位模式匹配
110xxxxx,则该组由该字节a和第二个字节组成b.如果没有字节b(因为字节a是要读取的最后一个字节),或者如果字节b与位模式不匹配10xxxxxx,则UTFDataFormatException抛出a.否则,该组将转换为字符:Run Code Online (Sandbox Code Playgroud)(char)(((a& 0x1F) << 6) | (b & 0x3F))如果一组的第一个字节的比特模式匹配
1110xxxx,则该组由字节的a和另外两个字节b和c.如果没有字节c(因为字节a是要读取的最后两个字节之一),或者字节b或字节c与位模式不匹配10xxxxxx,则UTFDataFormatException抛出a.否则,该组将转换为字符:Run Code Online (Sandbox Code Playgroud)(char)(((a & 0x0F) << 12) | ((b & 0x3F) << 6) | (c & 0x3F))如果组的第一个字节与模式
1111xxxx或模式匹配10xxxxxx,则UTFDataFormatException抛出a.如果在整个过程中的任何时候遇到文件结尾,则
EOFException抛出一个.在通过该过程将每个组转换为字符之后,以与从输入流中读取相应组的顺序相同的方式收集字符,以形成a
String,返回该字符.该
writeUTF接口的方法DataOutput可被用于将数据写入适合于通过该方法读取.