gpt4 book ai didi

java - 如何在 Java 中正确计算字符串的长度?

转载 作者:太空狗 更新时间:2023-10-29 22:32:09 24 4
gpt4 key购买 nike

我知道 String#lengthCharacter 中的各种方法或多或少地对代码单元/代码点起作用。

在 Java 中实际返回 Unicode 标准 ( UAX#29 ) 指定的结果的建议方法是什么,同时考虑语言/区域设置、规范化和字素集群等因素?

最佳答案

Java字符串长度的正常模型

String.length()指定作为返回字符串中 char 值(“代码单元”)的数量。这是对 Java 字符串长度的最普遍定义;见下文。

您对length 语义的描述1 基于后备数组/数组切片的大小是不正确的。 length() 返回的值也是支持数组或数组切片的大小这一事实仅仅是典型 Java 的实现细节类库。 String 不需要以这种方式实现。事实上,我想我已经看到了 Java String 实现,但它并没有以这种方式实现。


字符串长度的替代模型。

要获取字符串中 Unicode 代码点的数量,请使用 str.codePointCount(0, str.length()) -- 参见 the javadoc .

要获取特定编码(即字符集)中字符串的大小(以字节为单位),请使用 str.getBytes(charset).length2

要处理特定于语言环境的问题,您可以使用 Normalizer将 String 规范化为最适合您的用例的任何形式,然后如上所述使用 codePointCount。但在某些情况下,即使这样也行不通;例如Unicode 标准显然不符合匈牙利字母计数规则。


一般使用String.length()即可

大多数应用程序使用 String.length() 的原因是大多数应用程序不关心以人为中心的方式计算单词、文本等中的字符数。例如,如果我这样做:

String s = "hi mum how are you";
int pos = s.indexOf("mum");
String textAfterMum = s.substring(pos + "mum".length());

"mum".length() 没有返回代码点或者它不是语言上正确的字符计数真的无关紧要。它使用适合手头任务的模型测量字符串的长度。并且有效。

显然,当您进行多语言文本分析时,事情会变得有点复杂;例如搜索单词。但即便如此,如果您在开始之前对文本和参数进行规范化,则大多数时候您可以安全地使用“代码单元”而不是“代码点”进行编码;即 length() 仍然有效。


1 - 此描述是针对问题的某些版本。查看编辑历史……如果你有足够的代表点数。
2 - 使用 str.getBytes(charset).length 需要进行编码并将其丢弃。可能有一种通用方法可以在没有该副本的情况下执行此操作。这需要将 String 包装为 CharBuffer,创建一个自定义的 ByteBuffer 来充当字节计数器,然后使用 >Encoder.encode(...) 来计算字节数。注意:我没有试过这个,我不建议尝试,除非你有明确的证据表明 getBytes(charset) 是一个重要的性能瓶颈。

关于java - 如何在 Java 中正确计算字符串的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6828076/

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