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

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

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

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

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

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

谢谢

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

主要UTF-8专业人士:

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

主要UTF-8缺点:

  1. 许多常见字符具有不同的长度,这会减慢索引速度并极大地计算字符串长度。

主要UTF-16专业人士:

  1. 最合理的字符,如拉丁语,西里尔语,中文,日语,可以用2个字节表示。 除非需要非常奇特的字符,否则这意味着UTF-16的16位子集可以用作固定长度编码,从而加快索引速度。

主要UTF-16缺点:

  1. US-ASCII字符串中有很多空字节,这意味着没有以空字符结尾的字符串和大量浪费的内存。

通常,UTF-16通常更适合内存中表示,而UTF-8非常适合文本文件和网络协议

有两件事:

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

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

您可以想到的最基本的类是CharsetDecoderCharsetEncoder 。 但还有很多其他的。 String.getBytes() ,所有的ReaderWriter都是两种可能的方法。 并且还有所有静态的Character方法。

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

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

本网站提供UTF转UTF转换

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

UTF-32可以说是Unicode编码表单中人类可读的最多,因为它的大端hex表示只是没有“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位,这使得这非常浪费。