给定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方法,因此它将以单独的方式处理每个字符并返回字符数。