2017-01-31 22 views
2

UTF-8形式の文字を含むファイルを読み込もうとしています。UTF8からのファイルの読み込み

FILE * f = fopen(argv[1], "r"); 
    if(f == NULL){ 
      printf("cannot open %s\n", argv[1]); 
      exit(-1); 
     } 
    unsigned int c = getc(); 
    while(c != EOF){ 
     printf("%d\n", c); // UB 
     c = getchar(); 

    } 

どのようにファイルを読み込んでビット表現にするのですか?たとえば、次のようになります。0xA3 今は実際の整数を表示しています。 基本的に、文字をビット単位で読み込むにはどうすればよいですか?

+1

それが原因であなたがコードを書いている途中の整数を印刷しています。あなたがしようとしていることをもっと説明できますか?あなたはUTF-8がマルチバイトエンコーディングであることを知っていますか? –

+3

変更printf( "%d \ n"、c) 'printf("%#x \ n "、c)' –

+3

現代バイナリコンピュータのすべてのデータはバイナリ形式です。そのデータを*表示する方法を選択するだけです。あなたのケースでは、['printf'](http://en.cppreference.com/w/c/io/fprintf)とその異なるフォーマットについてもっと読むことをお勧めします。また、ちょうど*任意の[初心者の本](http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list)またはチュートリアルでは、 16進表記です。 –

答えて

2

UTF-8ファイル読み込み用のサンプル例は.....

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

int main(int argc, char *argv[]){ 
     setlocale(LC_ALL, "en_US.UTF-8"); 
     FILE * f = fopen(argv[1], "r"); 
     if(f == NULL){ 
       printf("cannot open %s\n", argv[1]); 
       exit(-1); 
     } 
     wchar_t wc; 
     while((wc=fgetwc(f))!=WEOF){ 
       //wprintf(L"%lc", wc); 
       // for output as hex of uthf-8 characters 
       wprintf(L"0X%X,",(wint_t) wc); 
     } 
     wprintf(L"\n"); 
     fclose(f); 
     return 0; 
} 
+1

これは移植性がありません。 –

+0

ここで使われているすべての関数は標準で利用できると思います。私はそれが移植可能でないもののために得るつもりはありませんか?あなたは私たちを照らすことができますか? – rajesh6115

+3

ロケール名はポータブルではありません。実装でutf-8ロケールがサポートされているとは限りません。 –

関連する問題