Windows 中中文與全形字元佔兩個位元組,全形字元第一位元組固定為 163(十進位),第二位元組為對應半形 ASCII 碼 + 128(空白除外)。中文字首位元組 > 163。本文提供依據此特性的全轉半演算法與 C++Builder 範例程式。
'A' (65) → 全形 163, 193 (163, 65+128)161, 161(特例)'阿' = 176, 162)c1:c1 == 163 → 全形字元,取第二位元組 c2 - 128 為半形字元,索引 +2。c1 > 163 → 中文字,保留雙位元組,索引 +2。c1 == 161 && c2 == 161 → 全形空白,轉為半形空白 ' ',索引 +2。
void __fastcall TForm1::Button1Click(TObject *Sender) {
int nLength = Edit1->Text.Length();
if (nLength == 0) return;
AnsiString str = "";
char* cTmp = new char[nLength + 1];
StrPCopy(cTmp, Edit1->Text);
byte c1, c2;
for (int i = 0; i < nLength; i++) {
c1 = cTmp[i]; c2 = cTmp[i+1];
if (c1 == 163) { str += AnsiString(char(c2 - 128)); i++; continue; }
if (c1 > 163) { str += AnsiString(char(c1)) + AnsiString(char(c2)); i++; continue; }
if (c1 == 161 && c2 == 161) { str += " "; i++; continue; }
str += AnsiString(char(c1));
}
Edit2->Text = str;
delete[] cTmp;
}
測試環境:C++Builder 5.0 / Windows 98 SE。注意:特殊字元(如 Alt+255)未處理。