〔プログラムの説明〕
文字列のコード変換を行うプログラムである。
(1) 入力文字列中のそれぞれの文字のコードを,表 1 の変換規則に
従って出力文字のコードに変換する。
表1 文字コードの変換規則
タイプ |
入力文字のバイト数 |
入力文字コードの範囲 |
変換方法 |
出力文字のバイト数 |
出力文字コー
ドの範囲 |
1 |
1 バイト |
0x20〜0x7E |
そのまま出力する |
1 バイト |
0x20〜0x7E |
2 |
2 バイト |
1 バイト目 0x8E |
識別のための制御コード
なので,出力しない |
1 バイト |
0x21〜0x7E |
2 バイト目 0xA1〜0xFE |
最上位ビットを 0 にする |
3 |
2 バイト |
各バイト 0xA1〜0xFE |
各バイトの最上位ビット
を 0 にする |
2 バイト |
各バイト
0x21〜0x7E |
(2) 入力文字列の中では,表 2 に示す制御コードが使われる。
表2 入力制御コード
タイプ |
種別 |
バイト数 |
コード |
プログラム 中での呼称 |
2 |
識別 |
1 バイト |
0x8E |
KSS |
(3) 入力は,表 1 の入力文字コードの範囲の文字だけで構成される。
(4) 入力文字列から出力文字列を作成するとき,タイプ 2 とタイプ 3 の
1 文字以上の連続する文字列の最初と最後には,表 3 に示す制御コード列を
付加する。
表3 出力制御コード
タイプ |
種別 |
バイト数 |
コード列 |
プログラム
中での呼称 |
2 |
開始 |
1 バイト |
0x0E |
KAI |
終了 |
1 バイト |
0x0F |
KAO |
3 |
開始 |
3 バイト |
0x1B 0x24 0x42 |
K2I |
終了 |
3 バイト |
0x1B 0x28 0x42 |
K2O |
(5) 関数 CodeConv の実行例は,図のとおりである。
図 文字列の変換例
〔プログラム〕
void CodeConv(char *instr, char *outstr)
{
static char K2I[] = "\x1b\x24\x42", K2O[] = "\x1b\x28\x42",
KAI = '\x0e', KAO = '\x0f', KSS = '\x8e';
int cctype, i, pctype = 1 ;
while (*instr != '\0') {
if (*instr == KSS)
cctype = 2;
else if (
)
cctype = 3;
else
cctype = 1;
if (
) {
if (pctype == 3)
for (i = 0; K2O[i] != '\0'; *outstr++ = K2O[i++]);
else if (pctype == 2)
*outstr++ = KAO;
if (cctype == 3)
for (i = 0; K2I[i] != '\0'; *outstr++ = K2I[i++]);
else if (cctype == 2)
*outstr++ = KAI;
;
}
if (cctype == 1)
*outstr++ = *instr++;
else if (cctype == 3) {
*outstr++ = *instr++ & 0x7f;
*outstr++ = *instr++ & 0x7f;
} else {
;
*outstr++ = *instr++ & 0x7f;
}
}
if (pctype == 3)
for (i = 0; K2O[i] != '\0'; *outstr++ = K2O[i++]);
else if (pctype == 2)
*outstr++ = KAO;
*outstr = '\0';
}