Last Update: Jul.4,2002

C Source Library

「LSI C-86 Ver.3.30c 試食版」、「Borland C++ 5.5」でコンパイル出来ます。

■ シフト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;
}