■ シフトJISコードをEUCコードに変換するサンプル
/*
* ms2euc.c : シフトJISコードをEUCコードに変換
*
* Copyright (c) 2000-2002 AOK.
*
* 2000.4. 3 - 初版
* 2001.7.14 - 2版
* 2002.7. 4 - 3版
*
* 使い方: MS2EUC 入力ファイル名 [出力ファイル名]
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef unsigned char BYTE;
void sjis2euc(BYTE *kj1, BYTE *kj2)
{
*kj1 <<= 1;
if (*kj2 < 0x9F) {
if (*kj1 < 0x3F)
*kj1 -= 0x61;
else
*kj1 += 0x1F;
if (*kj2 > 0x7E)
*kj2 += 0x60;
else
*kj2 += 0x61;
} else {
if (*kj1 < 0x3F)
*kj1 -= 0x60;
else
*kj1 += 0x20;
*kj2 += 0x02;
}
}
void conv_sjis2euc(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 (0xA1 <= c1 && c1 <= 0xDF) {
fputc(0x8E, fo);
fputc(c1, fo);
continue;
}
if ((n = getc(fi)) == EOF) break;
c2 = (BYTE)n;
sjis2euc(&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【使い方】 MS2EUC 入力ファイル名 [出力ファイル名]";
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, ".euc");
else
strcpy(s, ".euc");
} 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_sjis2euc(fin, fout);
/* 入出力ファイルをクローズ */
fclose(fin);
fclose(fout);
puts("\n*** 変換に成功しました.");
return 0;
}