早期軟體(如 Foxmail)常需同時支援 GB(大陸簡體)與 BIG5(繁體)編碼。TRichEdit 預設不支援 BIG5 直接顯示,本文介紹透過編碼對照表轉換,使 TRichEdit 正確顯示 BIG5 文字。
需一份 BIG5 → GB 對照表。範例使用 CCDOS 97 附帶的 CCDOS.TAB(45,840 bytes),每筆對應 2 bytes GB 碼。無法取得時可依 BIG5 編碼規則自行產生。
建立 Console 專案 TABTOHEX:
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *tab = fopen("ccdos.tab", "rb");
FILE *hex = fopen("tab.h", "wb");
fputs("unsigned char tab[45840]={", hex);
for (int i = 0; i < 45840; i++) {
if (i % 20 == 0) fputs("\n", hex);
unsigned int ch = fgetc(tab);
fprintf(hex, "0x%02x,", ch);
}
fputs("0xff};", hex);
fcloseall();
return 0;
}
編譯執行產生 tab.h,內含 unsigned char tab[45840] 陣列定義。
建立 VCL 專案,放置 TRichEdit、TButton。包含 tab.h,按鈕點擊事件:
#include "tab.h"
void __fastcall TForm1::Button1Click(TObject *Sender) {
unsigned long i = 0, address;
unsigned char ch1, ch2;
char *x = RichEdit1->Lines->GetText(); // 取得原始文字緩衝區
while (x[i] != '\0') {
ch1 = x[i];
if (ch1 >= 0xA1) { // 可能是 BIG5 雙字節首字節
ch2 = x[i+1];
if (ch2 >= 0x40 && ch2 <= 0x7E) {
address = ch1 * 314 + ch2 * 2 - 33010;
x[i] = tab[address];
x[i+1] = tab[address+1];
} else if (ch2 >= 0xA1 && ch2 <= 0xFE) {
address = ch1 * 314 + ch2 * 2 - 33078;
x[i] = tab[address];
x[i+1] = tab[address+1];
}
i += 2;
} else {
i++; // ASCII 字元直接跳過
}
}
RichEdit1->Lines->Text = x; // 回寫轉換後文字
RichEdit1->SetFocus();
RichEdit1->SelStart = 0;
}
Lines->Text,TRichEdit 以 GB 字庫正確顯示中文。此法讓舊版 BCB 專案以最小改動支援 BIG5 顯示,延伸既有系統壽命。