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

讓 TRichEdit 支援 BIG5 編碼顯示

     編輯:VC 教學

早期軟體(如 Foxmail)常需同時支援 GB(大陸簡體)與 BIG5(繁體)編碼。TRichEdit 預設不支援 BIG5 直接顯示,本文介紹透過編碼對照表轉換,使 TRichEdit 正確顯示 BIG5 文字。

編碼原理回顧

  • 英文 ASCII:1 byte。
  • 中文:2 bytes。內碼即字庫中邏輯位置,系統依內碼取字形顯示。
  • GB 碼:大陸標準。BIG5 碼:台灣標準。雙方內碼不同、字庫不同,混用產生亂碼。

BIG5 編碼範圍

  • 第一字節:0x81 ~ 0xFE
  • 第二字節:0x40 ~ 0x7E、0xA1 ~ 0xFE

三步驟實作

步驟 1:取得編碼對照表

需一份 BIG5 → GB 對照表。範例使用 CCDOS 97 附帶的 CCDOS.TAB(45,840 bytes),每筆對應 2 bytes GB 碼。無法取得時可依 BIG5 編碼規則自行產生。

步驟 2:轉換對照表為 C 陣列

建立 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] 陣列定義。

步驟 3:在 TRichEdit 中即時轉換顯示

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

運作流程

  1. 載入 BIG5 文字檔,TRichEdit 顯示亂碼(因系統用 GB 字庫解碼)。
  2. 點擊按鈕,遍歷文字緩衝區,偵測 BIG5 雙字節序列。
  3. 查表轉換為對應 GB 碼,就地修改緩衝區。
  4. 重新指派給 Lines->Text,TRichEdit 以 GB 字庫正確顯示中文。

擴充與注意

  • GB → BIG5 轉換同理,只需反向對照表。
  • 現代應用建議統一使用 Unicode (UTF-8/UTF-16),避免編碼轉換困擾。BCB 2009+ 完整支援 Unicode VCL。
  • 大檔案轉換時建議分塊處理或背景執行緒,避免 UI 凍結。

此法讓舊版 BCB 專案以最小改動支援 BIG5 顯示,延伸既有系統壽命。

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