- ベストアンサー
CFileでのUnicode保存について
- VC++ 2005 MFCで開発している際に、CFileやCStdioFileを使用してファイルを作成し、Unicode形式で保存する方法がわかりません。
- 作成したファイルをメモ帳などで開いた際に、文字コードフィルタが「ANSI」ではなく「Unicode」になっていることを確認したいです。
- プロジェクトの文字セットは「Unicode文字セット」を使用しています。作成後にAPIなどを使用して文字コードを変更する方法でも構いません。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
OSは何でしょうか? 私の環境(Windows2000)ではメモ帳でファイルを保存しようとすると、 ANSI Unicode Unicode big endian UTF-8 の選択が出ます。 試しにUnicodeで適当なファイルを保存してみるとファイル先頭にff feがついていますので、BOMありということですね。 ですので、ファイル先頭にff feを出力し、その後は文字コードをそのままバイナリで出力すれば、お望みの動作になるかと思います。
その他の回答 (3)
- redfox63
- ベストアンサー率71% (1325/1856)
MFCが内部で CRT(Cランタイムライブラリ)を使っているためランタイムのロケール設定が正しく設定されていないためのようですよ ファイルIOをする前に setlocateを使って日本語モードの設定をして見ましょう CWinAppのInitInstanceなどで setlocale( LC_ALL, "japanese"); などを実行してみましょう
- sutekiti_2
- ベストアンサー率0% (0/1)
notepad unicode で検索かけたら notepad.exe /W という起動オプションがあるのですがこれはどうでしょうか?
- chie65536
- ベストアンサー率41% (2512/6032)
>出力したファイルをメモ帳等で開いた場合に >文字コードフィルタが >「ANSI」ではなく「Unicode」になっていることです。 メモ帖に対して「このファイルの文字コードは何であるか?」は指示出来ません。 メモ帖は、ファイルの中身が何であろうが、構わずANSIファイルとして開きます。 これは「Windows(MS-DOS)の世界では、テキストファイルのデフォルトはすべてANSIである」と言う「お約束」によります。 ANSI以外の文字コードが使えるのは、メーラー内とか、ブラウザ内とか「常に、文書の本文に前置してヘッダーが存在し、ヘッダー内で文字コードの定義が行えるアプリ上のみ」に限定されます。 出力ファイルの文字コードをUnicodeにして出力したいなら「そのままUnicodeにして出力すれば良いだけ」です。出力されたファイルを「誰かが入力ファイルとして使う」場合、その「誰か」が「中身をどう解釈するか?」は、その「誰か」の責任であり、ファイルを作成したアプリに責任はありません。 言い換えれば「入力時に何らかの規則が設けられているなら、その規則に従って出力すれば良いだけ」です。 逆に言うと「(メモ帖のように)入力時に何の規則も設けられていないならば、出力は、従うべき規則、従わせるべき規則が存在しないので、何も出来ない。入力側に対して何の指示も与えられない」と言う事です。 つまり「何やっても無駄」ですから「無駄な事で悩んでも仕方が無い」です。
お礼
chie65536 様 ご回答ありがとうございます。 >出力されたファイルを「誰かが入力ファイルとして使う」場合、 >その「誰か」が「中身をどう解釈するか?」は、その「誰か」 >の責任であり 確かにそのとおりだと思います。 本件の場合、「誰か」は自身のAppになります。 出力したファイルはログファイル的に使用してメモ帳にフルパスを 引数にしてメモ帳自体をAppから起動します。 そこで文字化けが困ります。 ソースレベルで文字列は文字化けさせずに取得できますが メモ帳起動のためこまります。 >メモ帖は、ファイルの中身が何であろうが、 >構わずANSIファイルとして開きます。 そうでしょうか? CFile作成時に既に文字コードをunicodeで指定したテキストファイルを 作成しておけば問題なく仕様を満たします。 初回、ファイルが存在しない場合にファイルを作成するときに unicodeを指定できないことが問題になります。 見当ちがいでしたら申し訳ございませんが ご教授のほど宜しくお願いいたいます。
お礼
titokani 様 ご回答ありがとうございます。 できました。 テキストにヘッダ部があるとは盲点でした。 久々に新しい知識が身についた思いです。 以下のように実装しました。 DWORD dw1 = 0xFF; DWORD dw2 = 0xFE; fileLog.Write( &dw1, 1 ); fileLog.Write( &dw2, 1 ); 以上になります。 ありがとうございました。