2012-03-01 7 views
3

ファイルからユニコード文字を読み取る必要があります。私がそれらから行う必要があるのは、Unicode番号を抽出することだけです。私はCodeBlock Mingwを使用してWindows XP上で動作しています。Cのファイルからユニコード文字を読み取る

私は255のようにすべての時間を、結果を取得しています。この

#define UNICODE 
#ifdef UNICODE 
#define _UNICODE 
#else 
#define _MBCS 
#endif 

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <wchar.h> 
    int main() 
    { 
     wchar_t *filename=L"testunicode.txt"; 
     FILE *infile; 
     infile=_wfopen(filename,L"r"); 
     wchar_t result=fgetwc(infile); 
     wprintf(L"%d",result);//To verify the unicode of character stored in file,print it 
     return 0; 
    } 

ような何かをやっています。

testunicode.txtが(メモ帳で作成)をコード=ユニコード

に格納され、最終的なタスクは、任意の言語の文字を含むことができ、ファイルから読み取ることであるが、2バイトだけなのでのwchar_tであることができるようになりますすべての可能性のある文字のユニコードを取得しますか?

...お返事のための



おかげで、誰もがあなたの助けを必要としています。

ここでコードを変更しました。

#define UNICODE 
#ifdef UNICODE 
#define _UNICODE 
#else 
#define _MBCS 
#endif 

#include <stdio.h> 
#include <stdlib.h> 
#include <wchar.h> 
int main() 
{ 
    wchar_t *filename=L"testunicode.txt"; 
    FILE *infile; 
    infile=_wfopen(filename,L"r"); 
    wchar_t b[2]; 
    fread(b,2,2,infile);//Read a character from the file 
    wprintf(L"%d",b[1]); 
    return 0; 
} 

正しいUTF 16コードを出力します。それが使用されるプロジェクトでは、世界のさまざまな言語の文字を読み込む必要があります。 UTF-16はサフィックスになりますか、または保存されたファイルのエンコーディングをUTF-32に変更する必要がありますか?また、ここでwchar_tは2バイト、UTF-32では4バイトのデータ型が必要です。それを達成する方法は?お返事のために再び

おかげで........

+2

[リトルエンディアン](http://en.wikipedia.org/wiki/Little-endian)[UTF-16バイトオーダーマーク](http://en.wikipedia.org/wiki)/Byte_order_mark#UTF-16)は、ファイルの最初のバイトとして '0xFF'(255)を持ちます。あなたのコードはファイルの個々のバイトをループしないので、常に同じバイトが得られます。 –

+0

@FrédéricHamidi、fgetwcは最初の2バイトを単一の16ビット値として返すべきではありませんか?もしそうなら、結果は0xfffeではありませんか? –

+0

@マーク、nope、[fgetwc()](http://msdn.microsoft.com/en-us/library/c7sskzc1%28v=vs.100%29。aspx)は、ストリームがテキストモードまたはバイナリモードで開かれるかどうかに応じてマルチバイト文字またはワイド文字を読み取ります。[[_ wfopen()](http://msdn.microsoft.com/en-us/library /yeby3zcb%28v=vs.100%29.aspx)は 'mode'引数なしではデフォルトで' text'になるので、 'fgetwc()'はマルチバイト文字を読み込み、 '0xFF'でチョークし、だから私は実際にこの仮説をテストしなかったと思う)*。 –

答えて

4

まあ、あなたの質問のコードは、あなたのファイルの最初の文字を読み、あなたが順番に構築ループのいくつかの種類を実装する必要がありますそのファイルの内容全体を処理します。

さて、fgetwc()は、次の3つの理由2550xFF)を返すされています、あなたのアカウントに、ファイルのbyte-order markを取っていないので、あなたは、実際のファイルの内容の代わりにそれを読んで終わる

  • あなたは_wfopen()からmode引数に変換モードフラグを指定するので、デフォルトをtextにしてfgetwc()はそれに応じて、Oの代わりにマルチバイト文字を読み込もうとしていませんワイド文字F、

  • 0xFFは(little-endianUTF-16 BOMの最初のバイト)のでfgetwc()は、さらに処理せずに、それを返し、おそらくあなたのプログラムの現在のコードページ中の鉛のバイトではありません。

+0

_wfopenを呼び出すと、fgetwcはワイド文字を返します。 – Puneet

+0

'binary'フラグを指定してください:' _wfopen(filename、L "rb"); ' –

関連する問題