利用 Windows 核心 API (MultiByteToWideChar, WideCharToMultiByte, LCMapString) 實現 **Big5 (繁體) ⇄ GB (簡體)** 雙向轉換,無需第三方資料表,相容性極佳。
Big5 → Unicode (CP950) → GB 繁體 (CP936) → GB 簡體 (LCMapString SIMPLIFIED) GB 簡體 → GB 繁體 (LCMapString TRADITIONAL) → Unicode (CP936) → Big5 (CP950)
AnsiString __fastcall Big2Gb(AnsiString sBig)
{
// 1. Big5 → Unicode
int len = MultiByteToWideChar(950, 0, sBig.c_str(), -1, NULL, 0);
wchar_t* unicode = new wchar_t[len + 1];
MultiByteToWideChar(950, 0, sBig.c_str(), -1, unicode, len);
// 2. Unicode → GB 繁體
len = WideCharToMultiByte(936, 0, unicode, -1, NULL, 0, NULL, NULL);
char* gbTrad = new char[len + 1];
char* gbSimp = new char[len + 1];
WideCharToMultiByte(936, 0, unicode, -1, gbTrad, len, NULL, NULL);
// 3. GB 繁體 → GB 簡體
LCMapString(0x0804, LCMAP_SIMPLIFIED_CHINESE, gbTrad, -1, gbSimp, len);
AnsiString result = gbSimp;
delete[] unicode; delete[] gbTrad; delete[] gbSimp;
return result;
}
AnsiString __fastcall Gb2Big(AnsiString sGb)
{
// 1. GB 簡體 → GB 繁體
int len = MultiByteToWideChar(936, 0, sGb.c_str(), -1, NULL, 0);
char* gbTrad = new char[len * 2 + 1]; // 繁體可能較長
LCMapString(0x0804, LCMAP_TRADITIONAL_CHINESE, sGb.c_str(), -1, gbTrad, len * 2);
// 2. GB 繁體 → Unicode
wchar_t* unicode = new wchar_t[len + 1];
MultiByteToWideChar(936, 0, gbTrad, -1, unicode, len);
// 3. Unicode → Big5
len = WideCharToMultiByte(950, 0, unicode, -1, NULL, 0, NULL, NULL);
char* big5 = new char[len + 1];
WideCharToMultiByte(950, 0, unicode, -1, big5, len, NULL, NULL);
AnsiString result = big5;
delete[] gbTrad; delete[] unicode; delete[] big5;
return result;
}
| API | 用途 | 關鍵參數 |
|---|---|---|
MultiByteToWideChar | 多位元組 → Unicode | CodePage: 950(Big5), 936(GB) |
WideCharToMultiByte | Unicode → 多位元組 | CodePage: 同上 |
LCMapString | 地區對應轉換 | LCMAP_SIMPLIFIED_CHINESE / LCMAP_TRADITIONAL_CHINESE |