【问题标题】:If all Java Strings are UTF-16 strings then how can char datatype have max size of 2?如果所有 Java 字符串都是 UTF-16 字符串,那么 char 数据类型的最大大小如何为 2?
【发布时间】:2017-01-28 07:12:51
【问题描述】:

如果 Java 中的字符串是 UTF-16,则 UTF-16 字符的大小可能为 4 个字节。 所以 1 个 UTF-16 字符必须映射到 2 个字符。

这意味着字符串长度可能小于等效的 char[] 长度。

但事实并非如此。

Character x = new Character((char) 7000);
String s = new String(""+x+x+x);

byte [] ar =  s.getBytes();
char [] arr =  s.toCharArray();

字节数组的长度为 9。
char 数组的长度为 3。
那么 char 怎么能有 2 个字节的大小呢?

所以我认为java中的char可能大于2个字节,这取决于需要是正确的。

如果是这样,java 中 char 的最大大小是多少?或者它是可变长度的,将来可能会上升到无穷大?

【问题讨论】:

  • 你在谈论 4 个字节是什么? UTF-16 编码的重点在于代码点是用 1 个或 2 个 16 位代码单元编码的。 16 位是 2 个字节。这就是 UTF-16 中 16 位的含义

标签: java character-encoding char utf-16 utf


【解决方案1】:

String.getBytes() 调用不返回 UTF-16 内部表示。它以平台的默认编码返回字符串。在您的情况下,这很可能是 UTF-8(不过,作为平台确定的东西,您需要检查以确保)。 (char)7000(Unicode 代码点 U+1B58 BALINESE DIGIT EIGHT)的 UTF-8 编码形式是 3 个字节 - E1 AD 98。因此 3 个字符需要 9 个字节。

【讨论】:

  • 好吧,即使 UTF-16 字符可能是 4 个字节,那么它如何适合 2 个字节的 Java 字符?
  • 不合适。多个字符用于表示这些代码点。查看Stringdocs.oracle.com/javase/7/docs/api/java/lang/String.html中基于代码点的方法
  • @Piyush:UTF-16 将一个 16 位 char 用于代码点 U+0000U+FFFF,并使用两个 16 位 chars(称为“代理对”)用于更高的代码点.您的示例值(char)7000 是代码点U+1B58,它在UTF-16 中适合一个char,但在UTF-8 中是三个字节。
猜你喜欢
  • 2019-07-30
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
  • 2019-08-04
  • 2013-03-05
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
相关资源
最近更新 更多