[英]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 String
将String
建模为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.