3

我认为这是一个新手类型的问题,但我很明白这一点。

我可以找到很多关于如何将字符串转换为各种语言的字节数组的帖子。

我不明白的是在逐个字符的基础上发生了什么。我知道屏幕上显示的每个字符都由一个数字表示,例如它的 ascii 代码。(我们现在可以坚持使用 ASCII,所以我从概念上得到这个 :-))

这是否意味着当我想表示一个字符或一个字符串(这是一个字符列表)时,会发生以下情况

将字符转换为 ASCII 值 > 将 ascii 值表示为二进制?

我已经看到通过将字节数组定义为输入字符串长度的 1/2 来创建字节数组的代码,所以字节数组肯定是相同长度的字符串吗?

所以我有点困惑。基本上我试图将一个字符串值存储到 ColdFusion 中的一个字节数组中,我看不到它有一个明确的字符串到字节数组函数。

但是我可以进入底层的java,但我需要知道在理论上发生了什么。

在此先感谢您,如果您认为我疯了,请告诉我!

格斯

4

3 回答 3

5

在 Java 中,字符串存储为 16 位char值的数组。字符串中的每个 Unicode 字符在char数组中存储为一个或(很少)两个值。

如果要将一些字符串数据存储在byte数组中,则需要能够将字符串的 Unicode 字符转换为字节序列。这个过程称为编码,有几种方法可以做到这一点,每种方法都有不同的规则和结果。如果两段代码想要使用字节数组共享字符串数据,它们需要就使用哪种编码达成一致。

例如,假设我们有一个s要使用UTF-8编码的字符串。UTF-8 有一个方便的属性,如果你用它来编码一个只包含 ASCII 字符的字符串,输入中的每个字符都会被转换为具有该字符的 ASCII 值的单个字节。我们可以将 Java 字符串转换为 Java 字节数组,如下所示:

byte[] bytes = s.getBytes("UTF-8");

字节数组bytes现在包含来自 的字符串数据s,使用 UTF-8 编码编码为字节。

现在,我们在某处存储或传输字节,另一端的代码想要将字节解码回 Java String。它将执行以下操作:

String t = new String(bytes, "UTF-8");

假设没有出错,该字符串t现在包含与原始字符串相同的字符串数据s

请注意,两段代码必须就使用的编码达成一致。如果他们不同意,结果字符串可能最终包含垃圾,甚至可能根本无法解码。

于 2011-08-21T10:56:50.303 回答
1

你不是疯了。在所有事情中要记住字符串的关键是,对于计算机来说,字符不存在,只有数字存在。没有字符、字符串、文本或类似的东西实际上不是通过存储数字来实现的(实际上这适用于所有数据类型:布尔值实际上是范围非常小的数字,枚举是内部数字等)。这就是为什么说一段数据代表“A”或任何其他字符是没有意义的,您必须知道周围代码所采用的字符编码。

将字符串转换为字节数组恰好发生在有意透视(“这应该打印为 'A'”)和内部透视(“此存储单元包含 65”)之间的边界处。因此,要获得正确的结果,必须根据几种可能的字符集之一在它们之间进行转换,并选择正确的一种。请注意,JDK 提供了不需要字符集名称的便捷方法,并且始终使用从您的平台和环境变量推导出的默认字符集;但是知道你在做什么并明确说明字符集几乎总是一个更好的主意,而不是编写今天可以工作的东西,当你在另一台机器上执行它时神秘地失败。

于 2011-08-21T11:42:45.050 回答
0

根据Charset将字符串编码为字节数组。字符集可以将字符编码为更多或更少的位,然后是字节。

例如,如果您只需要显示密码(10 个不同的字符),您可以使用定义每个字符 4 位的字符集,获得每个字节 2 个字符的表示。操作系统的字符集通常在 String 到 byteArray 编码器中默认选择。要取回字符串,您必须使用相同的字符集解码该字符串。

于 2011-08-21T10:10:56.920 回答