「ANSI 編碼」泛指基於 ASCII 擴展的編碼體系。不同語系系統下的 ANSI 含義不同:英文系統為 ASCII,繁體中文為 Big5,日文為 Shift_JIS,簡體中文 Windows 預設代碼頁為 GBK。許多文本編輯器(如 EditPlus、記事本)預設以「ANSI」儲存,實際編碼取決於系統當前代碼頁。
大多數情況下,簡繁轉換屬於 GBK 字符集內部的字形映射。Windows 提供 LCMapString API 實現:
// 簡體 → 繁體
LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_TRADITIONAL_CHINESE, ...)
// 繁體 → 簡體
LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_SIMPLIFIED_CHINESE, ...)
參數說明請參閱 MSDN 文檔。
Big5(代碼頁 950)通行於台灣、香港。GBK 與 Big5 無直接映射關係,需透過 Unicode 作為中介:
GBK ↔ Unicode ↔ Big5
// GBK → Big5
int wcsLen = MultiByteToWideChar(CP_ACP, 0, szBuf, -1, NULL, 0);
wchar_t* wszString = new wchar_t[wcsLen];
MultiByteToWideChar(CP_ACP, 0, szBuf, -1, wszString, wcsLen);
int ansiLen = WideCharToMultiByte(950, 0, wszString, -1, NULL, 0, NULL, NULL);
char* szAnsi = new char[ansiLen];
WideCharToMultiByte(950, 0, wszString, -1, szAnsi, ansiLen, NULL, NULL);
// Big5 → GBK
int wcsLen = MultiByteToWideChar(950, 0, szBuf, -1, NULL, 0);
wchar_t* wszString = new wchar_t[wcsLen];
MultiByteToWideChar(950, 0, szBuf, -1, wszString, wcsLen);
int ansiLen = WideCharToMultiByte(CP_ACP, 0, wszString, -1, NULL, 0, NULL, NULL);
char* szAnsi = new char[ansiLen];
WideCharToMultiByte(CP_ACP, 0, wszString, -1, szAnsi, ansiLen, NULL, NULL);
簡體系統下預設以 GBK 解碼顯示,若直接查看轉為 Big5 的檔案會出現亂碼。可通過「控制面板 → 區域和語言」將系統預設語言改為「繁體中文(台灣)」,重啟後系統以 Big5 解碼,原本亂碼的「中國」二字即可正確顯示。測試完成後建議改回原設定,避免影響其他程式顯示。
簡體 GBK → 繁體 GBK → 繁體 Big5:第一步在 GBK 內部做字形映射,第二步跨字符集轉換。反向同理。