在char []到byte []之后的Java 11 Compact Strings魔术

chi*_*tiz 2 java string ascii extended-ascii java-9

在过去的两天内,我一直在阅读有关编码Unicode Java 9紧凑型字符串的知识,我的情况还不错。但是有些我不明白。

关于字节数据类型

1)。是8位存储范围从-128到127

问题

1)。为什么Java没有像char unsigned 16 bits那样实现它?我的意思是它将在0.256的范围内,因为从0到127仅可以保存一个Ascii值,但是如果我将值设置为200,扩展的ascii将会溢出到-56会发生什么。

2)。负值是否表示我在用Java 11尝试过一个简单示例的意思?

final char value = (char)200;//in byte would overflow
final String stringValue = new String(new char[]{value});
System.out.println(stringValue);//THE SAME VALUE OF JAVA 8
Run Code Online (Sandbox Code Playgroud)

我检查了String.value变量,然后看到一个字节数组

System.out.println(value[0]);//-56
Run Code Online (Sandbox Code Playgroud)

像以前一样出现相同的问题,-56是否表示我检测到该溢出的其他语言中的(负值),则返回值200?Java如何知道-56的值与char中的200相同。

我尝试了最困难的示例,如代码点128048,并且在String.value变量中看到了这样的字节数组。

0 = 61 
1 = -40
2 = 48
3 = -36
Run Code Online (Sandbox Code Playgroud)

我知道此代码点需要4个字节,但我知道如何将char []转换为byte [],但我不知道String如何处理此byte []数据。

很抱歉,这个问题很简单,很抱歉,任何键入英语都不是我的自然语言,非常感谢。

Hol*_*ger 5

为什么Java没有像char unsigned 16 bits那样实现它?我的意思是它将在0.256的范围内,因为从0到127仅可以保存一个Ascii值,但是如果我将值设置为200,扩展的ascii将会溢出到-56会发生什么。

Java的原始数据类型是25年前用Java 1.0解决的。不到两年前,紧凑型字符串是在Java 9中引入的。这项新功能仅仅是实现细节,并不能证明Java类型系统的根本变化是合理的。

除此之外,您正在查看对存储在字节中的数据的一种解释。为了表示iso-latin-1单位,解释与Java内置符号相同的数据byte将产生正数还是负数完全无关紧要。

同样,Java的I / O API允许将文件读入byte[]数组并将数组写byte[]回到文件,并且这两个操作已经足以无损复制文件,而不管文件格式在解释其内容时是否相关。

因此,从Java 1.1开始,以下工作:

byte[] bytes = "È".getBytes("iso-8859-1");
System.out.println(bytes[0]);
System.out.println(bytes[0] & 0xff);
Run Code Online (Sandbox Code Playgroud)
byte[] bytes = "È".getBytes("iso-8859-1");
System.out.println(bytes[0]);
System.out.println(bytes[0] & 0xff);
Run Code Online (Sandbox Code Playgroud)

这两个数字-56200只是对位模式的不同解释,11001000byte包含位模式的a的iso-latin-1解释11001000是字符È

char值也只是两个字节的数量的解释,即作为UTF-16代码单元。同样,char[]数组是具有标准解释的计算机内存中的字节序列。

我们也可以用这种方式解释其他字节序列。

StringBuilder sb = new StringBuilder().appendCodePoint(128048);
byte[] array = new byte[4];
StandardCharsets.UTF_16LE.newEncoder()
    .encode(CharBuffer.wrap(sb), ByteBuffer.wrap(array), true);
System.out.println(Arrays.toString(array));
Run Code Online (Sandbox Code Playgroud)

将打印您看到的值[61, -40, 48, -36]

byte[]String类中使用数组的优点是,现在可以选择解释,当所有字符都可以使用此编码表示时,可以使用iso-latin-1;否则使用utf-16。

可能的数字解释与字符串无关。但是,当你问“怎么能Java的知道,-56值是一样的200”,你应该问问自己,它是如何知道的位模式11001000byte-56摆在首位?

System.out.println(value[0]);
Run Code Online (Sandbox Code Playgroud)

与普通计算机算术相比,将byte(或an int)转换为String。该转换操作通常被忽略,因为它已被定义为打印a的默认方式byte,但并不比转换为String将值解释为无符号数量更自然。为了进一步阅读,我建议使用Two的补码