C言語関係掲示板

過去ログ

No.262.漢字を16進で表示

[戻る] [ホームページ]


No.1573

ファイル入力による文字について
投稿者---まいむ(2002/05/22 03:34:44)



今、ファイルから読み込んだ文字列のある1文字を Shift-JIS 規格で、
[半角:全角 カナ:英数][漢字] のどれ(どの状態)であるか、
調べるプログラムを作っているのですが、
ファイルの入力でつまづいています。

-- program_1.cpp --------------------------

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

int main(void){
  FILE *fp;
  int i=0;
  char Word[10]={0};

  //ファイルを読み込む /////
  if( ( fp = fopen("input.txt","r") )==NULL ){
    exit(1);
  }
  do{
    Word[i] = getc(fp);
  }while( Word[i++]!=EOF );
  putchar('\n');
  fclose(fp);

  //読み込んだ文字列を16進数で出力する /////
  i=0;
  do{
    printf("%x ", Word[i]);
  }while( Word[i++]!=EOF );
  return 0;
}
-- program end ---------------------------

このプログラムで例えば、input.txt ファイルに、「漢字」と入力して
(もちろん Shift-JIS で)実行すると、Shift-JIS の規格表によると

0a bf 8e 9a ffffff
(0000000a 000000bf 0000008e 0000009a ffffff)

と出力されるはずなのですが、実際は、

ffffff8a ffffffbf ffffff8e ffffff9a ffffff

となってしまいます。
これはもともとの仕様なのでしょうか?
それともウチのパソコンだけなんでしょうか?
また、この現象を回避する方法は無いのでしょうか?
「文字の状態を調べるプログラム」のほうでうまく 0 と f を、
処理する方法もあるかと思いますが、
できればこっちの方法でプログラムを書きたいです。

ちなみにプログラムを作っている環境は、
 OS   : Windows98
 Soft : Microsoft Virtual C++ 6.0
です。
この現象について知っている方、よろしくお願いします。

No.1586

Re:ファイル入力による文字について
投稿者---ともじ(2002/05/22 22:57:48)


こんばんは。

>今、ファイルから読み込んだ文字列のある1文字を Shift-JIS 規格で、
>[半角:全角 カナ:英数][漢字] のどれ(どの状態)であるか、
>調べるプログラムを作っているのですが、
>ファイルの入力でつまづいています。

>このプログラムで例えば、input.txt ファイルに、「漢字」と入力して
>(もちろん Shift-JIS で)実行すると、Shift-JIS の規格表によると
>
>0a bf 8e 9a ffffff
>(0000000a 000000bf 0000008e 0000009a ffffff)
>
>と出力されるはずなのですが、実際は、
>
> ffffff8a ffffffbf ffffff8e ffffff9a ffffff
>
>となってしまいます。

「漢字」は 8a bf 8e 9aですね。
これはいずれもバイト単位で見たときにMSB(最上位ビット)が 1 に
なりますね。それを
 printf("%x ", Word[i]);
とすると符号が拡張されて表示されるようです。
(ちなみにLSICでは符号を拡張せずにそのまま表示しました。)
 printf("%x ", (unsigned char)Word[i]);
と、キャストすると符号拡張はせずに 8a bf 8e 9a で表示しますね。


No.1594

Re:ファイル入力による文字について
投稿者---まいむ(2002/05/23 17:14:28)


すみません、このところインターネットが
できる状況ではなかったので、返信が遅れました。

そういえば「漢字」は 8a bf 8e 9aでしたね。違えました。

> printf("%x ", (unsigned char)Word[i]);
>と、キャストすると符号拡張はせずに 8a bf 8e 9a で表示しますね。

プログラムをかいて実行したところ、ちゃんと表示しました。
そうでしたか、キャスト演算子を使えばよかったんですね。
なんだかむずかしく考えていて、深みにはまっていたようです。

ともじさん、丁寧に教えてくださってありがとうございます。m(__)m
これからもこのホームページでC言語を勉強させていただきます。