给定String string
Java 中的 a ,是否string.codePoints().toArray().length
反映String
了人类认为有意义的实际字符的长度?换句话说,它是否平滑了转义字符和其他编码伪影?
编辑“人类”我的意思是“程序员”,因为我想象大多数程序员会看到\r\n
两个字符,ESC
一个字符等。但现在我看到即使是重音符号也会被原子化,所以没关系。
给定String string
Java 中的 a ,是否string.codePoints().toArray().length
反映String
了人类认为有意义的实际字符的长度?换句话说,它是否平滑了转义字符和其他编码伪影?
编辑“人类”我的意思是“程序员”,因为我想象大多数程序员会看到\r\n
两个字符,ESC
一个字符等。但现在我看到即使是重音符号也会被原子化,所以没关系。
不。
例如:
不会删除控制字符(如 ESC、CR、NL 等)。这些在 Unicode 中有不同的代码点。
空格、制表符等的序列未组合
不删除任意连字符 ( http://www.fileformat.info/info/unicode/char/00AD/index.htm ) 字符。
Unicode 组合字符 ( https://en.wikipedia.org/wiki/Combining_character ) 不会被组合。
现在值得商榷的是,其中一些是否可能是“人类会觉得有意义的实际角色” ……但总体答案仍然是否定的。
你澄清如下:
“人类”是指“程序员”,因为我想大多数程序员会将 \r\n 视为两个字符......
它比这更复杂。我是一名程序员,对我来说,这取决于上下文是否\r\n
有意义。如果我正在阅读自述文件,我的大脑会将空白区域的差异视为没有语义重要性。但是如果我正在编写一个解析器,我的代码会考虑空格......取决于它打算解析的语言。
只需检查 CharSequence 的 Javadoc 中的 codePoints() 方法:
从该序列返回代码点值流。序列中遇到的任何代理对都会像 Character.toCodePoint 一样组合,并将结果传递给流。任何其他代码单元,包括普通 BMP 字符、不成对的代理和未定义的代码单元,都被零扩展为 int 值,然后将其传递给流。https://docs.oracle.com/javase/8/docs/api/java/lang/CharSequence.html#codePoints--
与代码点相关的 String 类中的一个以了解代码点是什么:
String(int[] codePoints, int offset, int count) 分配一个新字符串,该字符串包含来自 Unicode 代码点数组参数的子数组的字符。https://docs.oracle.com/javase/8/docs/api/java/lang/String.html
代码点是表示 Unicode 代码点 ( https://docs.oracle.com/javase/8/docs/api/java/lang/Character.html#unicode ) 的 int ,因此即使是非人类字符也包括所有字符-可读。
String object.codePoints() 返回 Java 8 中的字符流。您正在调用 toArray 方法,因此它将以单独的方式处理每个字符并返回字符数。