ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:youdoukou CFileでのunidode保存
困り度:
  • すぐに回答を!
はじめまして、質問させてください。

VC++ 2005 MFCで開発しております。

CFile, CStdioFileを使用してファイルを作成した場合に
ファイル自体の文字コードを「Unicode」にしたいと考えております。

いろいろ試行錯誤いたのですがうまくいきませんでした。

アウトプットとしましては
出力したファイルをメモ帳等で開いた場合に
文字コードフィルタが
「ANSI」ではなく「Unicode」になっていることです。

ファイル作成時にUnicodeにできなくても
作成後にAPI等を使用して文字コードのみ変更する方法でもかまいません。

ちなみにプロジェクトの文字セットは「Unicode文字セット」を使用しております。

どなたかお詳しい方がおられましたらご教授お願いいたします。
宜しくお願いいたします。
質問投稿日時:08/04/21 13:57
質問番号:3964785
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

 

回答者:redfox63 MFCが内部で CRT(Cランタイムライブラリ)を使っているためランタイムのロケール設定が正しく設定されていないためのようですよ

ファイルIOをする前に setlocateを使って日本語モードの設定をして見ましょう

CWinAppのInitInstanceなどで
setlocale( LC_ALL, "japanese");
などを実行してみましょう
種類:回答
どんな人:専門家
自信:自信あり
回答日時:08/04/21 16:43
回答番号:No.4
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

 

回答者:sutekiti_2 notepad unicode
で検索かけたら
notepad.exe /W
という起動オプションがあるのですがこれはどうでしょうか?
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/04/21 15:37
回答番号:No.3
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

良回答20pt

回答者:titokani OSは何でしょうか?
私の環境(Windows2000)ではメモ帳でファイルを保存しようとすると、
ANSI
Unicode
Unicode big endian
UTF-8
の選択が出ます。

試しにUnicodeで適当なファイルを保存してみるとファイル先頭にff feがついていますので、BOMありということですね。
ですので、ファイル先頭にff feを出力し、その後は文字コードをそのままバイナリで出力すれば、お望みの動作になるかと思います。
種類:アドバイス
どんな人:専門家
自信:自信あり
回答日時:08/04/21 15:35
回答番号:No.2
この回答へのお礼titokani 様

ご回答ありがとうございます。
できました。

テキストにヘッダ部があるとは盲点でした。
久々に新しい知識が身についた思いです。

以下のように実装しました。
DWORD dw1 = 0xFF;
DWORD dw2 = 0xFE;
fileLog.Write( &dw1, 1 );
fileLog.Write( &dw2, 1 );

以上になります。
ありがとうございました。

回答

 

回答者:chie65536 >出力したファイルをメモ帳等で開いた場合に
>文字コードフィルタが
>「ANSI」ではなく「Unicode」になっていることです。
メモ帖に対して「このファイルの文字コードは何であるか?」は指示出来ません。

メモ帖は、ファイルの中身が何であろうが、構わずANSIファイルとして開きます。

これは「Windows(MS-DOS)の世界では、テキストファイルのデフォルトはすべてANSIである」と言う「お約束」によります。

ANSI以外の文字コードが使えるのは、メーラー内とか、ブラウザ内とか「常に、文書の本文に前置してヘッダーが存在し、ヘッダー内で文字コードの定義が行えるアプリ上のみ」に限定されます。

出力ファイルの文字コードをUnicodeにして出力したいなら「そのままUnicodeにして出力すれば良いだけ」です。出力されたファイルを「誰かが入力ファイルとして使う」場合、その「誰か」が「中身をどう解釈するか?」は、その「誰か」の責任であり、ファイルを作成したアプリに責任はありません。

言い換えれば「入力時に何らかの規則が設けられているなら、その規則に従って出力すれば良いだけ」です。

逆に言うと「(メモ帖のように)入力時に何の規則も設けられていないならば、出力は、従うべき規則、従わせるべき規則が存在しないので、何も出来ない。入力側に対して何の指示も与えられない」と言う事です。

つまり「何やっても無駄」ですから「無駄な事で悩んでも仕方が無い」です。
種類:回答
どんな人:一般人
自信:参考意見
回答日時:08/04/21 14:34
回答番号:No.1
この回答へのお礼chie65536 様
ご回答ありがとうございます。

>出力されたファイルを「誰かが入力ファイルとして使う」場合、
>その「誰か」が「中身をどう解釈するか?」は、その「誰か」
>の責任であり
確かにそのとおりだと思います。

本件の場合、「誰か」は自身のAppになります。
出力したファイルはログファイル的に使用してメモ帳にフルパスを
引数にしてメモ帳自体をAppから起動します。
そこで文字化けが困ります。

ソースレベルで文字列は文字化けさせずに取得できますが
メモ帳起動のためこまります。

>メモ帖は、ファイルの中身が何であろうが、
>構わずANSIファイルとして開きます。
そうでしょうか?
CFile作成時に既に文字コードをunicodeで指定したテキストファイルを
作成しておけば問題なく仕様を満たします。
初回、ファイルが存在しない場合にファイルを作成するときに
unicodeを指定できないことが問題になります。

見当ちがいでしたら申し訳ございませんが
ご教授のほど宜しくお願いいたいます。
最新から表示回答順に表示良回答のみ表示