• ベストアンサー

Unicodeのファイル読み込みがうまくいきません。。

下のようなコードで読もうとしているんですが、どうしても文字化けしてしまいます。原因が何なのかさっぱりわかりません。。 分かる方どうかお願いします!開発環境はVC++.NETです。 FILE* fin; wchar_t c; CString ss; if( (fin = fopen( "temp.txt", "r" )) == NULL ){ AfxMessageBox("temp.txtファイルオープンエラー"); exit(1); } fgetws( &c, 2, fin ); ss += c; AfxMessageBox(ss);

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

fgetwsを呼び出す前に、setlocale(LC_CTYPE, "");を実行してください。 それともう一点、cは1文字しか格納できないのに、サイズに2を指定しているのは間違いです。

exmotions
質問者

お礼

上記問題解決しました。直接int値入れました、、、が、、 解決しません。。

exmotions
質問者

補足

回答ありがとうございます。 最初はサイズ1を指定していたんですが、 2にしないとなぜかうまく動かないので。。 マルチバイト文字のせいでしょうか? >fgetwsを呼び出す前に、setlocale(LC_CTYPE, "");を実行してください。 必要な物はインクルードしたんですが、LC_CTYPEが未定義識別子になってしまいます。。

その他の回答 (4)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

もし、UTF-16のファイルを読もうとしているのであれば、fgetwsやfgetwcを使うのは不適当です。これらの関数は、あくまでも多バイト文字で格納されたファイルを読み込むためのものだからです。 UTF-16を扱いたいのであれば、バイナリモードで読み込む必要があります。

exmotions
質問者

お礼

ご回答ありがとうございます。 文字コードはUnicodeです。

exmotions
質問者

補足

皆様ご助力ありがとうございました。 なんとか解決することができました。 お返事が遅くなって大変申し訳ないです。 これにて質問を締め切らせて頂きます。

  • buihyaku
  • ベストアンサー率29% (97/326)
回答No.4

参考情報ですが、16ビットユニコードテキストは先頭にBOMと呼ばれる識別子が挿入されます。 これはビッグエンディアンとリトルエンディアンを区別するためのものでFFEFまたはFFFEのいずれかになります。 http://www.atmarkit.co.jp/aig/01xml/bom.html 読み込んだデータの先頭にでてきている" FF FE "はこのBOMデータだとおもいますので読み飛ばして処理されるとよいかとおもいます。

exmotions
質問者

お礼

ご回答ありがとうございます。 最初の2バイトはデータとは関係ないんですね。。 ありがとうございます!

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

> 最初はサイズ1を指定していたんですが、 > 2にしないとなぜかうまく動かないので。。 fgetwsは文字列を読み込む関数だからです。文字を読み込むのであれば、fgetwcを使うとよいでしょう。 > 必要な物はインクルードしたんですが、LC_CTYPEが未定義識別子になってしまいます。。 <locale.h>をインクルードしましたか?

exmotions
質問者

補足

夜分遅くにほんとうにありがとうございます。 >fgetwsは文字列を読み込む関数だからです。文字を読み込むのであれば、fgetwcを使うとよいでしょう。 こっちの方が引数が少なくて良いですね! ><locale.h>をインクルードしましたか? しましたが、未定義のままでした。強引に整数入れて解決しましたが、原因はよく分かりません(汗 文字は相変わらずですが、少し進展?がありました。 プロジェクトの設定で文字コードを"Unicodeを使用する"にしたところ、 バイナリのFFがyの上にちょんちょんがついた文字でダイアログに出てきました。 CStringが、なにか悪さしてるんでしょうかねぇ。。。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.1

ファイル内のバイナリデータと、読み込み後の変数に格納されたバイナリデータを比較し、変数への格納自体はプログラムの意図どおり成功しているのか、それとも変数への格納自体に失敗しているのかをまず補足願います。

exmotions
質問者

補足

ご回答ありがとうございます。 バイナリエディタで自動変数と比較したところ、 数値は合っていました。 FF FE 3C → 255 254 60 でした。ということはCStringへの代入がおかしいという事なんでしょうか。。

関連するQ&A