1

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

编辑“人类”我的意思是“程序员”,因为我想象大多数程序员会看到\r\n两个字符,ESC一个字符等。但现在我看到即使是重音符号也会被原子化,所以没关系。

4

3 回答 3

9

不。

例如:


现在值得商榷的是,其中一些是否可能是“人类会觉得有意义的实际角色” ……但总体答案仍然是否定的。


你澄清如下:

“人类”是指“程序员”,因为我想大多数程序员会将 \r\n 视为两个字符......

它比这更复杂。我是一名程序员,对我来说,这取决于上下文是否\r\n有意义。如果我正在阅读自述文件,我的大脑会将空白区域的差异视为没有语义重要性。但是如果我正在编写一个解析器,我的代码会考虑空格......取决于它打算解析的语言。

于 2016-08-24T12:38:01.950 回答
1

只需检查 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 ,因此即使是非人类字符也包括所有字符-可读。

于 2016-08-24T12:46:22.613 回答
0

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

于 2016-08-24T12:43:14.917 回答