Design Considerations

要使用任何脚本编写适用于任何语言的无缝代码,请记住以下几点。

ConsiderationReason
避免使用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.toUpperCaseString.toLowerCase方法可以正确处理这些情况。
删除字符时要小心。当调用索引指向补充字符的StringBuilder.deleteCharAt(int index)StringBuffer.deleteCharAt(int index)方法时,仅删除该字符的前半部分(第一个char值)。首先,对字符调用Character.charCount方法以确定是否必须删除一个或两个char值。
反转序列中的字符时要小心。在包含补充字符的文本上调用StringBuffer.reverse()StringBuilder.reverse()方法时,高和低代理对将反转,从而导致错误的代理对,甚至可能是无效的代理对。