# 设计注意事项

> 原文： [https://docs.oracle.com/javase/tutorial/i18n/text/design.html](https://docs.oracle.com/javase/tutorial/i18n/text/design.html)

要编写使用任何脚本无缝地为任何语言工作的代码，需要记住一些事项。

| 考虑 | 原因 |
| --- | --- |
| 避免使用`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)`方法适用于代码点值，但有些字符无法一对一转换。例如，小写的德语字符ß在转换为大写时变为两个字符 SS。同样，小希腊西格玛字符根据字符串中的位置而不同。 `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()`方法时，高和低代理对被反转，这导致不正确且可能无效的代理对。 |