UTF-8和UTF-16之间是否存在巨大差异?

时间:2014-03-14 12:04:27

标签: java xml utf-8 character-encoding utf-16

我调用了一个webservice,它给了我一个具有UTF-8编码的响应xml。我在java中使用getAllHeaders()方法检查了它。

现在,在我的java代码中,我接受了该响应,然后对其进行了一些处理。然后,将其传递给不同的服务。

现在,我用google搜索了一下,发现默认情况下,Java中的字符串编码是UTF-16。

在我的回复xml中,其中一个元素有一个角色É。现在这搞砸了我对其他服务的后处理请求。

而不是发送É,它发送了一些乱七八糟的东西。现在我想知道,这两种编码真的会有很大不同吗?如果我想知道什么将从UTF-8转换为UTF-16,那么我该怎么办呢?

由于

4 个答案:

答案 0 :(得分:20)

UTF-8和UTF-16都是可变长度编码。但是,在UTF-8中,一个字符可能占用至少8位,而在UTF-16中,字符长度从16位开始。

主要UTF-8职业选手:

  1. 基本ASCII字符,如数字,拉丁字符,否 重音等占用一个与US-ASCII相同的字节 表示。这样所有US-ASCII字符串都变为有效的UTF-8, 在许多情况下,它提供了良好的向后兼容性。
  2. 没有空字节,允许使用以空字符结尾的字符串,这个 这也引入了很多向后兼容性。
  3. 主要的UTF-8缺点:

    1. 许多常见字符的长度不同,这会减慢索引速度 并严重计算字符串长度。
    2. 主要UTF-16专业人士:

      1. 最合理的角色,如拉丁文,西里尔文,中文,日文 可以用2个字节表示。除非真正异国情调的人物 需要,这意味着UTF-16的16位子集可以用作a 固定长度编码,可加快索引速度。
      2. 主要UTF-16缺点:

        1. US-ASCII字符串中有很多空字节,表示没有 以null结尾的字符串和大量浪费的内存。
        2. 一般来说,UTF-16通常更适合内存中表示,而UTF-8非常适合文本文件和网络协议

答案 1 :(得分:3)

有两件事:

  • 您交换数据的编码;
  • Java的内部字符串表示。

你应该专注于第二点;)问题是使用适当的方法将数据(字节数组)转换为String s {{1} }数组最终),并将表单char转换为您的数据。

您可以想到的最基本的课程是CharsetDecoderCharsetEncoder。但还有很多其他的。 String,所有String.getBytes()Reader只是两种可能的方法。并且还存在Writer的所有静态方法。

如果您在某些时候看到乱码,则表示您无法将原始字节数据解码或编码为Java字符串。但同样,Java字符串使用UTF-16的事实与此无关。

特别是,您应该知道,在创建CharacterReader时,您应该指定编码;如果你没有这样做,将使用默认的JVM编码,它可能是,也可能不是UTF-8。

答案 2 :(得分:1)

本网站提供UTF到UTF转换

http://www.fileformat.info/convert/text/utf2utf.htm

UTF-32可以说是人类可读的Unicode编码表单,因为它的大端十六进制表示只是没有“U +”前缀的Unicode标量值,并且填充为八位数而且是UTF- 32表示确实使编程模型更简单,增加的平均存储大小有真正的缺点,使得完全过渡到UTF-32不那么引人注目。

无论其

UTF-32与旧的UCS-4编码相同,并保持固定宽度。为什么这可以保持固定宽度?由于UTF-16现在是可以编码最少字符数的格式,因此它为所有格式设置了限制。定义1,112,064是将由Unicode或ISO 10646定义的代码点总数。由于Unicode现在仅定义为0到10FFFF,UTF-32现在听起来有点像无点编码,因为它' 32位宽,但只使用大约21位,这使得这非常浪费。

答案 3 :(得分:-1)

UTF-8:一般来说,您应该使用 UTF-8。大多数 HTML 文档都使用这种编码。

它使用至少 8 位数据来存储每个字符。这可以提高存储效率,尤其是当文本主要包含英文 ASCII 字符时。但是高阶字符,例如非 ASCII 字符,每个可能需要多达 24 位!

UTF-16: 这种编码至少使用 16 位来编码字符,包括低位 ASCII 字符和高位非 ASCII 字符。

如果您编码的文本主要由非英语或非 ASCII 字符组成,则 UTF-16 可能会导致文件变小。但是,如果您使用 UTF-16 来编码大部分 ASCII 文本,则会占用更多空间。