说“ Java修改的UTF-8编码”是什么意思?

说“ Java修改的UTF-8编码”是什么意思?,第1张

说“ Java修改的UTF-8编码”是什么意思?

这在以下内容的javadoc中进行了详细说明

DataInput

修改后的UTF-8

DataInput
DataOutput
接口的实现以略微修改UTF-8的格式表示Unipre字符串。(有关标准UTF-8格式的信息,请参见
Unipre标准版本4.0的3.9 Unipre编码形式 )。请注意,在下表中,最高有效位出现在最左侧的列中。

…(某些表格,请单击javadoc链接查看自己)…

此格式与标准UTF-8格式之间的区别如下:

  • 字节
    'u0000'
    以2字节格式而不是1字节编码,因此编码的字符串永远不会嵌入空值。
  • 仅使用1字节,2字节和3字节格式。
    *补充字符以代理对的形式表示。


的javadoc中详细描述了如何阅读

DataInput#readUTF()

readUTF

String readUTF()throws IOException

读取已使用修改后的UTF-8格式编码的字符串。的一般约定

readUTF
是,它读取以修改后的UTF-8格式编码的Unipre字符串的表示形式;然后,将这个字符串作为返回
String

首先,读取两个字节,并以与

readUnsignedShort
方法完全相同的方式用于构造一个无符号的16位整数。此整数值称为 UTF长度
,它指定要读取的其他字节数。然后将这些字节分组考虑,将其转换为字符。每个组的长度是根据该组的第一个字节的值计算的。组之后的字节(如果有)是下一组的第一个字节。

如果组的第一个字节与位模式匹配

0xxxxxxx
(其中
x
表示“可能是”
0
1
“”),则该组仅由该字节组成。字节零扩展以形成一个字符。

如果组中的第一个字节与位模式匹配

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

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

如果一组的第一个字节的比特模式匹配

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

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

如果组的第一个字节与pattern

1111xxxx
或pattern
相匹配
10xxxxxx
,则
UTFDataFormatException
抛出a。

如果在此整个过程中的任何时间遇到文件末尾,则将

EOFException
引发一个。

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

String
,并将其返回。

writeUTF
接口的方法
DataOutput
可被用来编写适合于通过这种方法读取数据。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5479200.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存