■ EUCコードをシフトJISコードに変換するサンプル
/*
* euc2ms.c : EUCコードをシフトJISコードに変換
*
* Copyright (c) 2000-2002 AOK.
*
* 2000.4.3 - 初版
* 2002.7.4 - 2版
*
* 使い方: EUC2MS 入力ファイル名 [出力ファイル名]
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef unsigned char BYTE;
void euc2sjis(BYTE *kj1, BYTE *kj2)
{
if (*kj1 & 0x01) {
*kj1 >>= 1;
if (*kj1 < 0x6F)
*kj1 += 0x31;
else
*kj1 += 0x71;
if (*kj2 > 0xDF)
*kj2 -= 0x60;
else
*kj2 -= 0x61;
} else {
*kj1 >>= 1;
if (*kj1 <= 0x6F)
*kj1 += 0x30;
else
*kj1 += 0x70;
*kj2 -= 0x02;
}
}
void conv_euc2sjis(FILE *fi, FILE *fo)
{
int n;
BYTE c1, c2 = 0;
while ((n = getc(fi)) != EOF) {
c1 = (BYTE)n;
if (c1 < 0x80) {
fputc(c1, fo);
continue;
}
if ((n = getc(fi)) == EOF) break;
c2 = (BYTE)n;
if (c1 == 0x8E) {
fputc(c2, fo);
continue;
}
euc2sjis(&c1, &c2);
fputc(c1, fo);
fputc(c2, fo);
}
}
/* プログラムの本体 */
int main(int argc, char *argv[])
{
char f1[FILENAME_MAX+1]; /* 入力ファイル名 */
char f2[FILENAME_MAX+1]; /* 出力ファイル名 */
const char *usage = "\n【使い方】 EUC2MS 入力ファイル名 [出力ファイル名]";
FILE *fin, *fout;
char *s;
/* コマンドライン引き数のチェック */
if (argc == 3) {
strcpy(f1, argv[1]);
strcpy(f2, argv[2]);
} else if (argc == 2) {
strcpy(f1, argv[1]);
strcpy(f2, argv[1]);
s = strrchr(f2, '.');
if (s == NULL)
strcat(f2, ".sjs");
else
strcpy(s, ".sjs");
} else {
puts(usage);
exit(EXIT_FAILURE);
}
if (strcmpi(f1, f2) == 0) {
puts(usage);
exit(EXIT_FAILURE);
}
/* 入出力ファイルをオープン */
printf("入力ファイル名: %s\n", f1);
if ((fin = fopen(f1, "r")) == NULL) {
perror("入力ファイルをオープン出来ません.\n");
exit(EXIT_FAILURE);
}
printf("出力ファイル名: %s\n", f2);
if ((fout = fopen(f2, "w")) == NULL) {
perror("出力ファイルをオープン出来ません.\n");
fclose(fin);
exit(EXIT_FAILURE);
}
conv_euc2sjis(fin, fout);
/* 入出力ファイルをクローズ */
fclose(fin);
fclose(fout);
puts("\n*** 変換に成功しました.");
return 0;
}