Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java UTF-8和UTF-16之间有很大的区别吗_Java_Xml_Utf 8_Character Encoding_Utf 16 - Fatal编程技术网

Java UTF-8和UTF-16之间有很大的区别吗

Java UTF-8和UTF-16之间有很大的区别吗,java,xml,utf-8,character-encoding,utf-16,Java,Xml,Utf 8,Character Encoding,Utf 16,我调用一个webservice,它返回一个具有UTF-8编码的响应xml。我在java中使用getAllHeaders()方法检查了这一点 现在,在我的java代码中,我获取该响应,然后对其进行一些处理。然后,将其传递给其他服务 现在,我在谷歌上搜索了一下,发现默认情况下,Java中字符串的编码是UTF-16 在我的xml响应中,其中一个元素有一个字符。现在,我向另一家服务机构提出了后处理请求,这一点也被打断了 它没有发送É,而是发送了一些jibberish的东西。现在我想知道,这两种编码真的会

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

现在,在我的java代码中,我获取该响应,然后对其进行一些处理。然后,将其传递给其他服务

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

在我的xml响应中,其中一个元素有一个字符。现在,我向另一家服务机构提出了后处理请求,这一点也被打断了

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

有两件事:

  • 用于交换数据的编码
  • Java的内部字符串表示形式
你不应该全神贯注于第二点;)问题是使用适当的方法将数据(字节数组)转换为
String
s(
char
array),并将表单
String
s转换为数据

你能想到的最基本的类是和。但是还有很多其他的
String.getBytes()
,所有的
Reader
s和
Writer
s都是两种可能的方法。还有
字符
的所有静态方法

如果您在某个时候看到乱码,这意味着您无法将原始字节数据解码或编码为Java字符串。但是,Java字符串使用UTF-16这一事实与此无关

特别是,您应该注意,当您创建
读卡器
写卡器
时,您应该指定编码;如果您未能这样做,将使用默认的JVM编码,它可能是UTF-8,也可能不是。

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

UTF-8的主要优点:

  • 基本ASCII字符,如数字、不带字符的拉丁字符 重音符号等占用一个字节,与US-ASCII相同 代表性。这样,所有US-ASCII字符串都成为有效的UTF-8, 它在许多情况下提供了良好的向后兼容性
  • 无空字节,允许使用以空结尾的字符串,这 还引入了大量向后兼容性
  • UTF-8的主要缺点:

  • 许多常用字符的长度不同,这会减慢索引速度 以及计算字符串长度
  • UTF-16的主要优点:

  • 最合理的字符,如拉丁语、西里尔语、汉语、日语 可以用2个字节表示。除非真的有异国情调的角色 如果需要,这意味着UTF-16的16位子集可以用作 固定长度编码,可加快索引速度
  • UTF-16的主要缺点:

  • US-ASCII字符串中有大量空字节,这意味着没有 以null结尾的字符串和大量浪费的内存

  • 一般来说,UTF-16通常更适用于内存表示,而UTF-8非常适用于文本文件和网络协议。该网站提供UTF到UTF的转换


    UTF-32可以说是最具可读性的Unicode编码形式,因为它的大端十六进制表示法只是Unicode标量值,没有“U+”前缀,零填充到八位数字,而UTF-32表示法确实使编程模型更简单,平均存储容量的增加有实际的缺点,这使得完全过渡到UTF-32不再那么引人注目

    然而


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

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

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

    UTF-16: 此编码使用至少16位对字符进行编码,包括低阶ASCII字符和高阶非ASCII字符


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

    如何读取和写入XML?JAXB?斯塔克斯?你能展示你创建读写器的代码吗?回答得好。你能不能打消我的好奇心,说出UTF-32的一个实际用途?就我的一生而言,我想不出它存在的理由。一个简单的谷歌给我带来的仅仅是“速度优化”。我有一个问题,也许是一个很小的问题。以一个简单的记事本为例。假设我调用某个服务,该服务返回UTF-8编码的数据。这基本上是所有的ASCII或其他编码。现在我有一个来自webservice的角色(说“a”)。现在这个A将被映射到UTF-8中的某个东西。例如00000000(8位)。现在当记事本解释这个时,它会将它转换成0000(4位)。现在,它不会把我的一切都搞砸吗?检查我下面的答案UTF-32可以说是最容易让人读懂的Unicode编码形式,因为它的大端十六进制表示形式只是Unicode标量值,没有“U+”pr