我是Java的初学者,我试图向我自己理解和解释这个for循环是如何工作的。指令说,它通过使用循环为每个单词中的每个字母转换等效的数字Unicode。
基于我的理解,for循环使用.length()遍历整个单词,然后将其存储为int i,该整数被带入charAt的i括号中。 CharAt返回单词中的每个字符,然后int将其转换为存储为finalInt的int。
所以我的问题是unicode号是哪里来的?它怎么知道它是unicode?
String word1;
int finalInt;
for (int i = 0; i < word1.length(); i++) {
finalInt = (int) word1.charAt(i);
}
答案 0 :(得分:3)
Java字符基于Unicode
字符信息基于Unicode标准6.0.0版本。
https://docs.oracle.com/javase/7/docs/api/java/lang/Character.html
此外,char和int可以相互转换。请参阅:Convert int to char in java
答案 1 :(得分:2)
检查ASCII表-http://www.asciitable.com/
您的代码将char(最后一列)转换为其数字表示形式(第一列)。
答案 2 :(得分:0)
使用Java,这个
charAt()
如何将字符串转换为整数?
Java String
将字符串建模为char
(不是int
)值的数组。因此charAt
只是索引(概念)数组。所以您会说字符串是整数值...表示字符。
(在内部,不同版本的Java实际上使用了多种实现方法。在某些版本中,实际的表示形式不是char[]
。但这全都隐藏在站点中...和您可以放心地忽略它。
所以我的问题是unicode号码是哪里来的?
它来自创建String
的代码;即代码比称为new String(...)
的代码要多。
如果从String
构造char[]
,则假定数组中的字符是有效的UTF-16表示形式的序列中的UTF-16代码单元。 / p>
如果String
是由byte[]
构造的,则从某些指定的或隐含的编码中 decoded 字节序列。如果您提供将使用的编码(例如Charset
)。否则,将使用应用程序的默认编码。无论哪种方式,解码器都负责产生有效的Unicode。
有时候这些东西坏了。例如,如果您的应用程序提供了以一种编码方式编码的byte[]
并告诉String
构造函数它是另一种编码,则您很可能在String
中得到废话Unicode。通常称为mojibake。
它怎么知道它是unicode?
String
设计为基于Unicode。
需要知道的代码是由其他事物构成字符串的代码。 String
类仅假定其内容有意义。 (从一个层面上讲,这无关紧要。您可以用格式错误的UTF-16或完全废话填充String
。String
会忠实地记录并复制废话。)
话虽如此,您的代码中有一个重要错误。
charAt
方法不返回Unicode代码点。字符串主要建模为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
。但是重要的是要仔细阅读javadocs以了解应如何使用该方法。 (使用String.codePoints()
方法可能更简单。)
无论如何,这意味着您的代码在所有情况下均未为finalInt
分配Unicode代码点。它适用于BMP(代码平面零)中的Unicode字符,但不适用于较高代码平面。例如,它将中断Emojis的Unicode代码点。