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

C語言中漢字比較大小的正確姿勢:strcmp、wcscmp、locale 感知排序

     編輯:C 語言問答

問題本質:多位元組字元編碼下的位元組序比較

漢字在記憶體中以多位元組編碼儲存 (GBK/UTF-8/UTF-16)。直接用 `strcmp` 比較的是位元組序,而非語義上的「大小」(拼音/筆劃/部首)。

常見場景解決方案

1. 簡單 ASCII/位元組序比較 (如排序鍵值、去重)

#include <string.h>
int cmp = strcmp(str1, str2); // 返回 <0, 0, >0
// 等價於逐位元組比較 unsigned char 值

2. 寬字元 (wchar_t) + 標準庫比較

#include <wchar.h>
#include <locale.h>
setlocale(LC_ALL, "zh_CN.utf8"); // 或 "chs" (Windows)
wchar_t ws1[] = L"中文";
wchar_t ws2[] = L"英文";
int cmp = wcscmp(ws1, ws2); // 依當前 locale 排序規則

3. ICU (International Components for Unicode) —— 專業級方案

跨平台、支援 Unicode 校準算法 (UCA)、可自定義權重 (拼音/筆劃/部首/注音)。

// 概念代碼
#include <unicode/ucol.h>
UCollator *coll = ucol_open("zh_CN", &status);
UCollationResult res = ucol_strcoll(coll, ustr1, len1, ustr2, len2);
// res: UCOL_LESS / UCOL_EQUAL / UCOL_GREATER

4. Windows API: CompareStringEx

#include <windows.h>
int cmp = CompareStringEx(LOCALE_NAME_USER_DEFAULT, 0,
    str1, -1, str2, -1, NULL, NULL, 0);
// 返回 CSTR_LESS_THAN (1), CSTR_EQUAL (2), CSTR_GREATER_THAN (3)

避坑指南

  • 不要對 `signed char*` 直接用 `strcmp`,負數值會導致錯誤排序,轉為 `unsigned char*` 或 `wchar_t*`。
  • 原始碼檔案編碼、編譯器執行字元集、終端機編碼、locale 設定必須一致 (建議全鏈路 UTF-8)。
  • 嵌入式無 ICU/locale 時,可自建漢字→拼音/筆劃映射表,轉換後再比較整數鍵值。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved