繁体   English   中英

使用Java,这个charAt()如何; 把一个字符串变成一个int?

[英]Using Java, how is this charAt(); turn a string into an int?

我是 Java 的初学者,我试图理解并向自己解释这个 for 循环是如何工作的。 说明说它正在通过使用循环转换每个单词中每个字母的数字 Unicode 等价物。

根据我的理解,for 循环使用 .length() 遍历整个单词,然后将其存储为 int i,它被带到 charAt 的 i 的括号中。 CharAt 返回单词中的每个字符,然后 int 将其转换为存储为 finalInt 的 int。

所以我的问题是 unicode number 从哪里来? 它怎么知道它是unicode?

String word1;
int finalInt; 

for (int i = 0; i < word1.length(); i++) {
    finalInt = (int) word1.charAt(i);

        }

Java 字符基于 Unicode

字符信息基于 Unicode 标准 6.0.0 版。

https://docs.oracle.com/javase/7/docs/api/java/lang/Character.html

此外,char 和 int 可以相互转换。 请参考: 在java中将int转换为char

检查 ASCII 表 - http://www.asciitable.com/
您的代码正在将字符(最后一列)转换为其数字表示(第一列)。

使用 Java,这个charAt()如何将字符串转换为 int?

Java StringString建模为char (而不是int )值数组。 所以charAt只是索引(概念)数组。 所以你cn说字符串整数值......代表字符。

(在幕后,Java 的不同版本实际上使用了多种实现方法。在某些版本中,实际表示不是char[] 。但这对站点来说都是隐藏的......你可以放心地忽略它。

所以我的问题是 unicode number 从哪里来?

它来自创建String的代码; 即代码比称为new String(...)

  • 如果String是从char[]构造的,则假定数组中的字符是有效 UTF-16 表示序列中的 UTF-16 代码单元。

  • 如果String是从构造byte[]该字节序列是由一些指定或隐含编码解码 如果您提供将使用的编码(例如Charset )。 否则将使用应用程序的默认编码。 无论哪种方式,解码器都负责生成有效的 Unicode。

有时这些东西会坏掉。 例如,如果您的应用程序提供以一种编码方式编码的byte[]并告诉String构造函数它是一种不同的编码,则您很可能在String得到无意义的 Unicode。 通常称为mojibake

它怎么知道它是unicode?

String被设计为基于 Unicode。

需要知道的代码是从其他事物形成字符串的代码。 String类只是假设它的内容是有意义的。 (在一个层面上......它不在乎。您可以使用格式错误的 UTF-16 或完全无意义的内容填充String 。该String将忠实地记录和再现无意义内容。)


话虽如此,您的代码中有一个重要的错误。

charAt方法不返回 Unicode 代码点。 String 主要建模为一系列 UTF-16 代码单元,而charAt返回这些.

Unicode 代码点实际上是 0 hex到 10FFFF hex范围内的数字。 这不适合char ... 限制为 0 hex到 FFFF hex

UTF-16 将 Unicode 代码点编码为 16 位代码单元。 因此, charAt返回的值表示整个 Unicode 代码点(对于 0 hex到 FFFF hex范围内的代码点)或代码点的顶部或底部(对于大于 FFFF hex 的代码点)。

如果您希望String返回(完整)Unicode 代码点,则需要使用String.codePointAt 但是仔细阅读 javadoc 以了解应该如何使用该方法是很重要的。 (使用String.codePoints()方法可能更简单。)

无论如何,这意味着您的代码不会在所有情况下都将 Unicode 代码点分配给finalInt 它适用于 BMP(代码平面零)中的 Unicode 字符,但不适用于更高的代码平面。 例如,它会因表情符号的 Unicode 代码点而中断。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM