- ベストアンサー
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);
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
fgetwsを呼び出す前に、setlocale(LC_CTYPE, "");を実行してください。 それともう一点、cは1文字しか格納できないのに、サイズに2を指定しているのは間違いです。
その他の回答 (4)
- jacta
- ベストアンサー率26% (845/3158)
もし、UTF-16のファイルを読もうとしているのであれば、fgetwsやfgetwcを使うのは不適当です。これらの関数は、あくまでも多バイト文字で格納されたファイルを読み込むためのものだからです。 UTF-16を扱いたいのであれば、バイナリモードで読み込む必要があります。
お礼
ご回答ありがとうございます。 文字コードはUnicodeです。
補足
皆様ご助力ありがとうございました。 なんとか解決することができました。 お返事が遅くなって大変申し訳ないです。 これにて質問を締め切らせて頂きます。
- buihyaku
- ベストアンサー率29% (97/326)
参考情報ですが、16ビットユニコードテキストは先頭にBOMと呼ばれる識別子が挿入されます。 これはビッグエンディアンとリトルエンディアンを区別するためのものでFFEFまたはFFFEのいずれかになります。 http://www.atmarkit.co.jp/aig/01xml/bom.html 読み込んだデータの先頭にでてきている" FF FE "はこのBOMデータだとおもいますので読み飛ばして処理されるとよいかとおもいます。
お礼
ご回答ありがとうございます。 最初の2バイトはデータとは関係ないんですね。。 ありがとうございます!
- jacta
- ベストアンサー率26% (845/3158)
> 最初はサイズ1を指定していたんですが、 > 2にしないとなぜかうまく動かないので。。 fgetwsは文字列を読み込む関数だからです。文字を読み込むのであれば、fgetwcを使うとよいでしょう。 > 必要な物はインクルードしたんですが、LC_CTYPEが未定義識別子になってしまいます。。 <locale.h>をインクルードしましたか?
補足
夜分遅くにほんとうにありがとうございます。 >fgetwsは文字列を読み込む関数だからです。文字を読み込むのであれば、fgetwcを使うとよいでしょう。 こっちの方が引数が少なくて良いですね! ><locale.h>をインクルードしましたか? しましたが、未定義のままでした。強引に整数入れて解決しましたが、原因はよく分かりません(汗 文字は相変わらずですが、少し進展?がありました。 プロジェクトの設定で文字コードを"Unicodeを使用する"にしたところ、 バイナリのFFがyの上にちょんちょんがついた文字でダイアログに出てきました。 CStringが、なにか悪さしてるんでしょうかねぇ。。。
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
ファイル内のバイナリデータと、読み込み後の変数に格納されたバイナリデータを比較し、変数への格納自体はプログラムの意図どおり成功しているのか、それとも変数への格納自体に失敗しているのかをまず補足願います。
補足
ご回答ありがとうございます。 バイナリエディタで自動変数と比較したところ、 数値は合っていました。 FF FE 3C → 255 254 60 でした。ということはCStringへの代入がおかしいという事なんでしょうか。。
お礼
上記問題解決しました。直接int値入れました、、、が、、 解決しません。。
補足
回答ありがとうございます。 最初はサイズ1を指定していたんですが、 2にしないとなぜかうまく動かないので。。 マルチバイト文字のせいでしょうか? >fgetwsを呼び出す前に、setlocale(LC_CTYPE, "");を実行してください。 必要な物はインクルードしたんですが、LC_CTYPEが未定義識別子になってしまいます。。