gpt4 book ai didi

Java 字符串 UTF-8 限制

转载 作者:行者123 更新时间:2023-11-30 08:01:47 27 4
gpt4 key购买 nike

我正在尝试直接从文件中反序列化字符串,我有一个关于超长字符串的问题:Java 字符串的字符数限制等于 Integer.MAX_VALUE,即 31^2-1 .

但我的问题来了:当我有一个 UTF-8 字符串,其大小略小于该大小但由大小超过 1 个字节的字符组成,然后我要求 Java 给我字节数组时会发生什么?

为了更清楚,如果我可以运行这段代码会发生什么? (我没有足够的 RAM):

String toPrint = "";
String string100 = "";
int max = Integer.MAX_VALUE -100;
for (int i = 0; i < 100; i += 10) {
string100 += "1234567ñ90";
}
for (int i = 0; i < max; i += 100) {
toPrint += string100;
}
System.out.println("String complete!");
byte[] byteArray = toPrint.getBytes(StandardCharsets.UTF_8);
System.out.println(byteArray.length);
System.exit(0);

它是否打印“String complete!”?还是之前坏过?

最佳答案

从根本上说,Strings 的限制是它们内部的char 数组的长度不能超过最大数组长度,即大致为Integer。 MAX_VALUE 并且大于您的变量 max。字符串将其字符存储在 UTF-16 中,因此字符串的 UTF-16 表示不能超过最大数组长度。 UTF-8 中的字节数和逻辑字符数(Unicode 代码点或 UTF-32 字符)最终无关紧要。

现在让我们转到您的特定示例。由于“1234567ñ90”中的 10 个字符中的每一个都是单个 UTF-16 值,因此该字符串占用了 Stringchar 数组的 10 个值。尽管您的代码性能糟糕且内存需求高,但它最终应该达到“String complete!”。如果有足够的可用内存。但是,当转换为 UTF-8 时它会中断,因为字符串的 UTF-8 表示比最大数组长度长,因为“ñ”需要超过一个字节。

关于Java 字符串 UTF-8 限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37273974/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com