眠いのでソースだけとりあえず(あとから説明かく)
#include <iostream> #include <cstdlib> #define ESC 0x1B void jisToSjis(int *h, int *l){ if(*h & 1){ if(*l < 0x60) *l += 0x1F; else *l += 0x20; } else *l += 0x7E; if(*h < 0x5F) *h = (*h + 0xE1) >> 1; else *h = (*h + 0x161) >> 1; } int main(void){ int c, d; enum {FALSE, TRUE} jiskanji = FALSE; while ((c = getchar()) != EOF) { if (c == ESC) { if ((c = getchar()) == '$') { if ((c = getchar()) == '@' || c == 'B') { jiskanji = TRUE; } else { putchar(ESC); putchar('$'); if (c != EOF) putchar(c); } } else if (c == '(') { if ((c = getchar()) == 'H' || c == 'J') { jiskanji = FALSE; } else { putchar(ESC); putchar('('); if (c != EOF) putchar(c); } } else if (c == 'K') { jiskanji = TRUE; } else if (c == 'H') { jiskanji = FALSE; } else { putchar(ESC); if (c != EOF) putchar(c); } } else if (jiskanji && c >= 0x21 && c <= 0x7E) { if ((d = getchar()) >= 0x21 && d <= 0x7E) jisToSjis(&c, &d); putchar(c); if (d != EOF) putchar(d); } else if (c >= 0xA1 && c <= 0xFE) { if ((d = getchar()) >= 0xA1 && d <= 0xFE) { d &= 0x7F; c &= 0x7F; jisToSjis(&c, &d); } putchar(c); if (d != EOF) putchar(d); } else putchar(c); } return 0; }