如果我使用Java 8的String.codePoints来获取int codePoints数组,那么数组的长度是字符数吗?
给定Java中的String string
, 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
是否有意义。 如果我正在阅读README文件,我的大脑会将空白区域中的差异视为没有语义重要性。 但是,如果我正在编写解析器,我的代码会考虑空格…取决于它要解析的语言。
只需检查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)分配一个新的String,该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.On中要调用toArray方法的字符流,因此它将以单独的方式处理每个字符并返回字符数。