Last Update: Jul.26,2002

C Source Library

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

■ ユニコードテキストの表示

/*
 *  a2w.c : ユニコードテキストの表示
 *
 *      Copyright (c) 2002 AOK. 
 *
 *      2002.04.05 - 初版
 *      2002.07.26 - 2版
 *
 *  【使い方】a2w UNICODEテキストファイル名
 *
 *  出力をファイルにとりたいときは、
 *
 *      a2w input.txt > output.txt
 *
 *  のようにする。
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include "cp932.h"

#define B_ENDIAN    0
#define L_ENDIAN    1

const size_t table_size = sizeof(conv_table) / sizeof(CONVTABLE);

typedef int (*FPTR)(const void*, const void*);

int compare(CONVTABLE *a, CONVTABLE *b)
{
    long r = a->unicode - b->unicode;
    if (r == 0)     return 0;
    else if (r > 0) return 1;
    return -1;
}

CONVTABLE *search(unsigned short *pw)
{
    return (CONVTABLE *)bsearch(
        pw, conv_table, table_size, sizeof(CONVTABLE), (FPTR)compare);
}

unsigned short unicode2sjis(unsigned short ucode)
{
    CONVTABLE *ptr;
    if ((ptr = search(&ucode)) == NULL) return 0;
    return ptr->sjiscode;
}

int main(int argc, char *argv[])
{
    FILE *fp;
    int high, low;
    unsigned short u, r;
    int endian = B_ENDIAN;

    /* 前処理 */
    if (argc < 2) { /* error */ return 1; }
    if ((fp = fopen(argv[1], "rb")) == NULL) { /* error */ return 1; }

    /* Byte Order Mark のチェック */
    if ((low = getc(fp)) == EOF)  { fclose(fp); return 1; }
    if ((high = getc(fp)) == EOF) { fclose(fp); return 1; }
    u = high << 8 | low;
    if      (u == 0xFEFF) endian = L_ENDIAN;
    else if (u == 0xFFFE) endian = B_ENDIAN;
    else rewind(fp); /* BOM 無し */
        
    /* 変換、表示 */
    while ((low = getc(fp)) != EOF) {
        if ((high = getc(fp)) == EOF) { putchar('?'); break; }
        if (endian == L_ENDIAN) u = high << 8 | low;
        else                    u = low  << 8 | high;
            
        r = unicode2sjis(u);
        
        if (r == 0)          printf("??");
        else if (r == 0x0D)  /* skip */;
        else if (r & 0xFF00) printf("%c%c", r >> 8, r & 0xFF);
        else                 printf("%c", r);
    }

    /* 後処理 */
    fclose(fp);
    
    return 0;
}