【问题标题】:Using Java, how is this charAt(); turn a string into an int?使用 Java,这个 charAt(); 怎么样?把一个字符串变成一个int?
【发布时间】:2019-10-14 10:50:29
【问题描述】:

我是 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);

        }

【问题讨论】:

  • char 是一种数字类型,恰好可以表示为字符。转换为 int 只会暴露底层的数值。
  • 啊,我认为这增加了一点澄清!我必须记住这一点!谢谢!

标签: java unicode


【解决方案1】:

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

【讨论】:

  • 非常感谢您提供的参考资料。我会看看他们。我一直在努力寻找涵盖这一点的研究,但显然我不知道自己在寻找什么。非常感谢!!你知道在 Unicode 中是否有一个每个字符代表什么的列表?我遇到了很多列表,但我不知道哪个是正确的。
  • @JackieTowns Wikipedia 有一个 list of Unicode characters,但您可能会发现其他网站更易于访问。官方的最新列表保存在 Unicode 联盟的网站上:Unicode.org。到目前为止,已经定义了大约 138,000 个字符,并且还在不断增加。如果您是 Mac 用户,请下载 UnicodeChecker 应用程序。
【解决方案2】:

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

【讨论】:

  • 哇!!这非常有帮助!我一直在找这种东西!!你能解释一下为什么这些数字被列为 DEC 吗?这意味着十进制还是什么?如果您不介意,为什么会这样列出?我知道我可能会重复,但是 unicode 是从哪里来的呢?我似乎无法连接 Unicode 和 ASCII....
  • @JackieTowns 是的,十进制 (base10)、十六进制 (base 16)、八进制 (base 8) 和 HTML 字符实体。 Unicode 是 ASCII 的超集。有关这一切的更多信息,请参阅 Wikipedia。
  • @BasilBourque 非常感谢所有的参考资料!!
  • 该参考适用于那些谈论 ASCII 或 ANSI 并且可能会感到困惑或不确定如何正确使用它们或如何学习 Unicode 的人。 Java 用户只需阅读 Java 文档即可了解 char 是一个 UTF-16 代码单元,而 UTF-16 是 Unicode 字符集的几种字符编码之一。我们都知道我们没有使用 ASCII,对吧??
【解决方案3】:

用Java,这个charAt()是怎么把字符串转成int的?

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

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

所以我的问题是 unicode 数字从何而来?

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

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

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

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

它怎么知道它是 unicode?

String 设计为基于 Unicode。

需要知道的代码是由其他东西组成字符串的代码。 String 类只是假设它的内容是有意义的。 (在某个层面上......它不在乎。您可以使用格式错误的 UTF-16 或完全废话填充 StringString 将忠实地记录和重现废话。)


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

charAt 方法不返回 Unicode 代码点。字符串主要建模为 UTF-16 代码单元序列,charAt 返回 那些

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

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

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

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

【讨论】:

    猜你喜欢
    • 2017-11-14
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 2019-07-12
    • 2021-09-28
    相关资源
    最近更新 更多