当前位置: 首页 > 面试题库 >

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

庞旺
2023-03-14
问题内容

说“ Java修改的UTF-8编码”是什么意思?与普通的UTF-8编码有何不同?


问题答案:

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

修改后的UTF-8

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

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

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

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


的javadoc中详细描述了如何阅读DataInput#readUTF()

readUTF

String readUTF()
           throws IOException

读取已使用修改后的UTF-8格式编码的字符串。的一般约定readUTF是,它读取以修改后的UTF-8格式编码的Unicode字符串的表示形式;然后,将这个字符串作为返回String

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

如果组的第一个字节与位模式匹配0xxxxxxx(其中x表示“可能是” 01“”),则该组仅由该字节组成。字节零扩展以形成一个字符。

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

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

如果一组的第一个字节的比特模式匹配1110xxxx,则该组由字节的a和另外两个字节bc。如果没有字节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可被用来编写适合于通过这种方法读取数据。



 类似资料:
  • 问题内容: 我在Java的内部表示形式中搜索String,但是我得到了两种看上去可靠但不一致的资料。 一种是: http://www.codeguru.com/cpp/misc/misc/multi-lingualsupport/article.php/c10451 它说: Java将UTF-16用于内部文本表示,并支持对字符串序列化UTF-8的非标准修改。 另一个是: http://en.wik

  • 问题内容: 我正在修复一些错误的UTF-8编码。我目前正在使用PHP 5和MySQL。 在我的数据库中,我有一些编码错误的实例,例如:ƒ 数据库整理是utf8_general_ci PHP使用的是正确的UTF-8标头 Notepad ++设置为使用不带BOM的UTF-8 数据库管理在phpMyAdmin中处理 并非所有重音符号的情况都被破坏 我需要某种函数来帮助我将ƒ,®,?,?¼和其他类似的实例

  • 问题内容: 最近,我们将应用程序从JDK 7迁移到了JDK8。更改之后,我们遇到了以下代码段的问题。 字节数组可能包含无效的UTF-8字节序列。UTF-8解码时,相同的字节数组在Java 7和Java 8上产生两个不同的字符串。 根据此SO帖子的答案,Java 8“修复”了Java7中的错误,并用替换字符串替换了无效的UTF-8字节序列,该字符串符合UTF-8规范。 但是我们想坚持使用Java 7

  • 问题内容: 目前,我正在尝试开始使用Spring MVC。在尝试时,我遇到了编码问题。 我想在我的JSP页面上显示UTF-8字符,所以我在ModelAndView中添加了一个带有UTF-8字符的字符串。看起来像这样: 在JSP页面上,我只想显示具有UTF-8字符的字符串,如下所示: 结果,我得到以下结果: 请注意,下面的代码显示没有编码错误。我还在Springsource Tool Suite中将

  • 我想知道是否有人能帮忙,我很难将UTF-8字符发布到SagePay。数据库是MySQL,带有数据库字符集utf8和数据库排序规则utf8_general_ci。数据库连接字符串使用useUnicode=true 所有发布到数据库的数据都存储为UTF-8,所有查询的数据都显示为UTF-8,但当字符串编码如下时: 然后发到SagePay,他们会收到一个来自国际字符所在位置的乱码字符串。如果字符串中不包

  • 问题内容: 使用UTF-8编码创建字符串时存在不一致的地方。 运行此代码: 在Java 1.8.0_20(及更早版本)上,我们得到结果 在Java 1.7和1.6上,我们得到正确的结果: 您遇到此错误了吗?有没有解决方法? 对于Shift_JIS,JIS_X0212-1990,x-IBM300,x-IBM834,x-IBM942,x-IBM942C,x-JIS0208来说,这种不一致也很明显,但显