Design Considerations
要使用任何脚本编写适用于任何语言的无缝代码,请记住以下几点。
Consideration | Reason |
---|---|
避免使用char 数据类型的方法。 | 避免使用char 基本数据类型或使用char 数据类型的方法,因为使用该数据类型的代码不适用于补充字符。对于采用char 类型参数的方法,请使用相应的int 方法(如果有)。例如,使用Character.isDigit(int) 方法而不是Character.isDigit(char) 方法。 |
使用isValidCodePoint 方法验证代码点值。 | 代码点定义为int 数据类型,它允许值超出代码点值的有效范围(从 0x0000 到 0x10FFFF)。出于性能原因,将代码点值作为参数的方法不检查参数的有效性,但是可以使用isValidCodePoint 方法检查该值。 |
使用codePointCount 方法对字符进行计数。 | String.length() 方法返回字符串 中的代码单元数或 16 位char 值。如果字符串 包含补充字符,则该计数可能会产生误导,因为它不能反映出代码点的真实数量。若要获得准确的字符数计数(包括补充字符),请使用codePointCount 方法。 |
使用String.toUpperCase(int codePoint) 和String.toLowerCase(int codePoint) 方法,而不要使用Character.toUpperCase(int codePoint) 或Character.toLowerCase(int codePoint) 方法。 | 尽管Character.toUpperCase(int) 和Character.toLowerCase(int) 方法适用于代码点值,但是有些字符无法一对一转换。例如,小写的德 Literals 符ß转换为大写字母时,会变成两个字符 SS。同样,小希腊 Sigma 字符取决于字符串 中的位置。 Character.toUpperCase(int) 和Character.toLowerCase(int) 方法无法处理这些情况。但是,String.toUpperCase 和String.toLowerCase 方法可以正确处理这些情况。 |
删除字符时要小心。 | 当调用索引指向补充字符的StringBuilder.deleteCharAt(int index) 或StringBuffer.deleteCharAt(int index) 方法时,仅删除该字符的前半部分(第一个char 值)。首先,对字符调用Character.charCount 方法以确定是否必须删除一个或两个char 值。 |
反转序列中的字符时要小心。 | 在包含补充字符的文本上调用StringBuffer.reverse() 或StringBuilder.reverse() 方法时,高和低代理对将反转,从而导致错误的代理对,甚至可能是无效的代理对。 |