Last Update: Jul.4,2002

C Source Library

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

■ 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;
}