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