说“Java Modified UTF-8 Encoding”是什么意思?

说“Java Modified UTF-8 Encoding”是什么意思? 它与普通的UTF-8编码有什么不同?

这在DataInput的javadoc中有详细描述:

修改了UTF-8

DataInputDataOutput接口的实现表示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表示“可能是01 ”),则该组仅由该字节组成。 该字节被零扩展以形成一个字符。

如果组的第一个字节与位模式110xxxxx匹配,则该组由该字节a和第二个字节b 。 如果没有字节b (因为字节a是要读取的最后一个字节),或者如果字节b与位模式10xxxxxx不匹配,则抛出UTFDataFormatException 。 否则,该组将转换为字符:

 (char)(((a& 0x1F) << 6) | (b & 0x3F)) 

如果组的第一个字节与位模式1110xxxx匹配,则该组由该字节a和另外两个字节bc 。 如果没有字节c (因为字节a是要读取的最后两个字节之一),或者字节b或字节c与位模式10xxxxxx不匹配,则抛出UTFDataFormatException 。 否则,该组将转换为字符:

 (char)(((a & 0x0F) << 12) | ((b & 0x3F) << 6) | (c & 0x3F)) 

如果组的第一个字节与模式1111xxxx或模式10xxxxxx ,则抛出UTFDataFormatException

如果在整个过程中的任何时候遇到文件结尾,则抛出EOFException

通过此过程将每个组转换为字符后,将按照从输入流中读取相应组的顺序收集字符,以形成返回的String

接口DataOutputwriteUTF方法可用于写入适合于通过此方法读取的数据。

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,以及在类文件中嵌入常量字符串。 “