如果我使用 Java 8 的 String.codePoints 来获取一个 int codePoint 数组,数组的长度是字符数是真的吗?



给定Java中的String string, string.codePoints().toArray().length是否反映了人类认为有意义的String的实际字符长度?换句话说,它是否平滑了转义字符和其他编码工件?

编辑通过"人类",我有点意思是"程序员",因为我想象大多数程序员会将rn视为两个字符,ESC视为一个字符,等等。但是现在我看到重音符号也被原子化了所以无所谓了

No。

例如:

  • 控制字符(如ESC, CR, NL等)将不会被删除。

  • 空格、制表符等序列不合并

  • 不删除任意连字符(http://www.fileformat.info/info/unicode/char/00AD/index.htm)。

  • Unicode组合字符(https://en.wikipedia.org/wiki/Combining_character)不组合


现在有争议的是,其中一些是否可能是"人类会发现有意义的实际字符"…但总体答案仍然是否定的。


您的说明如下:

我说的"人"大概是指"程序员",因为我想象大多数程序员会把rn看作两个字符…

实际情况要复杂得多。我是一名程序员,对我来说,这取决于rn是否有意义。如果我正在阅读一个README文件,我的大脑会将空白的差异视为没有语义重要性。但是,如果我正在编写解析器,我的代码将考虑空白…

检查CharSequence的Javadoc代码点()方法:

返回来自该序列的代码点值流。序列中遇到的任何代理对都像按字符一样组合。toCodePoint,并将结果传递给流。任何其他代码单元,包括普通的BMP字符、未配对的代理和未定义的代码单元,都是0扩展为int值,然后传递给流。https://docs.oracle.com/javase/8/docs/api/java/lang/CharSequence.html codePoints -

和String类中与代码点相关的一个来理解代码点是什么:

String(int[] codePoints, int offset, int count)分配一个新的String,其中包含来自Unicode码点数组参数子数组的字符。https://docs.oracle.com/javase/8/docs/api/java/lang/String.html

码点是表示Unicode码点的int (https://docs.oracle.com/javase/8/docs/api/java/lang/Character.html#unicode),因此包括所有字符,甚至包括那些不可读的字符。

String object.codePoints()返回Java 8中的字符流。您正在调用toArray方法,因此它将以单独的方式处理每个字符并返回字符数。

最新更新