Java 字符串 UTF-8 限制

标签 java string utf-8 limits

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

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

更清楚地说,如果我可以运行这段代码会发生什么? (我的内存不够):

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

它是否打印“字符串完成!”?还是之前就坏了?

最佳答案

从根本上来说,Strings 的限制是其中的 char 数组不能长于最大数组长度,该长度大致为Integer。 MAX_VALUE 且大于变量 max。字符串以 UTF-16 存储其字符,因此字符串的 UTF-16 表示形式不能超过最大数组长度。 UTF-8 中的字节数和逻辑字符(Unicode 代码点,或 UTF-32 字符)的数量最终并不重要。

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

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

相关文章:

java - 如何在每个大写字母之间添加空格?

regex - Coldfusion ReReplace 电话号码重新格式化

Python在带有非ascii字符或不带有非ascii字符的unicode变量中进行解码

java - Hibernate 序列 nextVal 已解析但未使用 (Oracle)

java - 如何修复 JButton 使其不占用整个 JFrame

swift - 如何在不丢失顺序的情况下删除 Swift 中字符串的重复行?

ruby - 在使用 Mechanize 进行抓取时,我总是在 Ruby 2.0 中遇到 UndefinedConversionError

php - 插入错误编码后更新MySQL数据库中的数据

java - Spring 4 - HTTP 状态 400,所需参数不存在

C - 在读 CTRL+Z 之前如何阅读短语?