【问题标题】:Java UTF-16 Encoding codeJava UTF-16 编码代码
【发布时间】:2011-08-18 00:41:57
【问题描述】:

java中将Unicode码点(整数)编码为char数组(字节)的函数基本上是这样的:

return new char[] { (char) codePoint };

这只是从整数值转换为字符。

我想知道这种转换实际上是如何完成的,该转换背后的代码用于将整数值转换为以 UTF-16 编码的字符。我尝试在 java 源代码上寻找它,但没有运气。

【问题讨论】:

  • 在 Java 中,char 不是“字节”大小(8 位)的实体,而是两个字节的值。

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


【解决方案1】:

我不确定你说的是哪个函数。

将有效的 int 代码点转换为 char 将适用于基本多语言平面中的代码点,这取决于 UTF-16 的定义方式。要转换高于 U+FFFF 的任何内容,您应该使用 Character.toChars(int) 转换为 UTF-16 代码单元。该算法在RFC 2781中定义。

【讨论】:

  • 由于代理对,并非char 的所有值都代表有效的代码点(一对之外)——即使char 的所有值都是有效数字。例如。它不仅仅是“0xffff 以上的任何东西”。 +1 但是包含转换方法(回答问题)和链接。
  • @pst - 如果不明显,在这种情况下,“任何东西”表示规范中定义的有效 Unicode 代码点(Java 6 的 Unicode 4)。
  • @pst - 来自 Unicode 4,chapter 2最低平面,基本多语言平面,包含范围 0000..FFFF。(数字以 16 为基数)
  • char 表示的所有数字都是有效的代码点,但并非所有都是有效的标量值。 (标量值是不是代理代码点的代码点。)因此,并非所有char 值都是标量值,并且并非所有可能的char 序列都是UTF-16 字符串。但是,Character.toChars 不会检查参数是否为有效的标量值。
  • @pst - 啊,我明白你在删除的评论中的意思 - 你引用了算法:如果 U 我会修改答案。
【解决方案2】:

此外,char 数组在 Java 平台中已经是 UTF-16。

【讨论】:

  • 不一定正确。即使 char 是 16 位,字符数组也可以保存无效 UTF-16 的数据(例如,无效的代理对)。并非所有代码点都适合 char
  • 对,我的意思是一个字符数组的每个字符都是UTF-16,因为skiforfun的数组,但是我可能没有正确理解他的问题。
【解决方案3】:

Java 中的所有chars 在内部都以 UTF-16 表示。这只是将整数值映射到 char

【讨论】:

  • 不一定正确。 char 只是一个 16 位值(本身没有代理对的概念)。也许应该在这种情况下谈论字符文字?
【解决方案4】:

由于char 被定义为在 Java 中保存 UTF-16 数据,这就是它的全部内容。 只有如果输入是 int(即它可以表示 U+10000 或更大的 Unicode 代码点),则需要进行一些计算。所有char 值都已经是UTF-16。

【讨论】:

  • 不一定正确。 char 只是一个 16 位值(本身没有代理对的概念)。不过,可以很好地指出 Unicode 与 char 的范围。
【解决方案5】:

代码点只是一个映射到字符的数字,没有进行真正的转换。 Unicode 代码点以十六进制指定,因此无论您使用十六进制的 codePoint 都将映射到该字符(或字形)。

【讨论】:

  • (或映射到char的代理对...)
猜你喜欢
  • 2012-03-13
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
  • 2019-02-25
  • 2012-07-23
  • 2016-03-14
相关资源
最近更新 更多