Như những người khác đã chỉ ra cách ưa thích là sử dụng:
new StringBuilder(hi).reverse().toString()
Nhưng nếu bạn muốn tự mình thực hiện điều này, tôi sợ rằng phần còn lại của phản hồi có sai sót.
Lý do là String
đại diện cho một danh sách các điểm Unicode , được mã hóa trong một char[]
mảng theo mã hóa có độ dài thay đổi: UTF-16 .
Điều này có nghĩa là một số điểm mã sử dụng một phần tử của mảng (một đơn vị mã) nhưng các điểm khác sử dụng hai trong số chúng, do đó, có thể có các cặp ký tự phải được coi là một đơn vị (thay thế "cao" và "thấp" liên tiếp) .
public static String reverseString(String s) {
char[] chars = new char[s.length()];
boolean twoCharCodepoint = false;
for (int i = 0; i < s.length(); i++) {
chars[s.length() - 1 - i] = s.charAt(i);
if (twoCharCodepoint) {
swap(chars, s.length() - 1 - i, s.length() - i);
}
twoCharCodepoint = !Character.isBmpCodePoint(s.codePointAt(i));
}
return new String(chars);
}
private static void swap(char[] array, int i, int j) {
char temp = array[i];
array[i] = array[j];
array[j] = temp;
}
public static void main(String[] args) throws Exception {
FileOutputStream fos = new FileOutputStream("C:/temp/reverse-string.txt");
StringBuilder sb = new StringBuilder("Linear B Syllable B008 A: ");
sb.appendCodePoint(65536); //http://unicode-table.com/es/#10000
sb.append(".");
fos.write(sb.toString().getBytes("UTF-16"));
fos.write("\n".getBytes("UTF-16"));
fos.write(reverseString(sb.toString()).getBytes("UTF-16"));
}