直接按字節反轉會破壞多字節字符編碼,導致亂碼。本文實現按字符單位反轉,兼容 GBK/UTF-8 雙字節/三字節中文字符。
char *MyInverseStr(char *source) {
int len = strlen(source);
char *rev = malloc(len + 1);
int j = 0;
for (int i = len - 1; i >= 0; i--) {
unsigned char c = source[i];
// GBK 判斷:高位字節 >= 0x80
if (c >= 0x80) { // 可能為中文字節
// GBK 雙字節:低位字節在後
if (i >= 1) {
rev[j++] = source[i-1];
rev[j++] = source[i];
i--; // 跳過已處理的低位字節
}
} else {
rev[j++] = source[i]; // ASCII 單字節
}
}
rev[j] = '\0';
return rev;
}
// UTF-8 首字節模式:110xxxxx(2字節) 1110xxxx(3字節) 11110xxx(4字節)
if ((c & 0xE0) == 0xC0) { // 2字節字符
if (i >= 1) { rev[j++] = source[i-1]; rev[j++] = source[i]; i--; }
} else if ((c & 0xF0) == 0xE0) { // 3字節字符(中文常見)
if (i >= 2) {
rev[j++] = source[i-2];
rev[j++] = source[i-1];
rev[j++] = source[i];
i -= 2;
}
}
wchar_t / char16_t 寬字符處理輸入: "Hello世界" 輸出: "界世olleH" // 正確保持"世界"字符完整性
理解字符編碼本質,是 C 語言國際化處理的前提。