首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言字符串反轉:處理中文字符的 UTF-8/GBK 編碼邊界問題

     編輯:關於C語言

C語言字符串反轉:正確處理多字節字符(中文)的編碼邊界

直接按字節反轉會破壞多字節字符編碼,導致亂碼。本文實現按字符單位反轉,兼容 GBK/UTF-8 雙字節/三字節中文字符。

問題根源

  • ASCII:1 字節/字符,按字節反轉安全
  • GBK:中文 2 字節,高位字節 > 127 (0x80)
  • UTF-8:中文 3 字節,首字節 0xE0-0xEF
  • 直接反轉字節序會拆分字符編碼單元

解決方案:按編碼單元識別反轉


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;
}

關鍵邏輯解析

  1. 從末尾向前掃描
  2. 遇高位字節(≥0x80)識別為多字節字符一部分
  3. 按正確順序複製完整字符單元(低位在前,高位在後)
  4. 索引跳過已處理字節

UTF-8 擴展版


// 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 寬字符處理
  • 引入 ICU 庫進行專業 Unicode 處理
  • 明確項目編碼規範(推薦 UTF-8)
  • 測試用例覆蓋:純 ASCII、純中文、混合、標點、Emoji

測試驗證

輸入: "Hello世界"
輸出: "界世olleH"  // 正確保持"世界"字符完整性

理解字符編碼本質,是 C 語言國際化處理的前提。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved