• ベストアンサー

Unicodeで保存されたtxtファイルを開いて編集後Unicodeで保存する方法について

VC++.NETを使ってプログラミングをしております。 タイトルの通り、Unicodeで保存されているtxtファイルを 開いて編集後、再びUnicodeのtxtで保存したいのですが、 具体的な方法がわかりません。 普通にCFileクラスで開いて、CStringクラスで編集後、 保存して大丈夫でしょうか? サンプルプログラムが紹介されているWEBページや、方法を ご存知の方教えてください。

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

  • ベストアンサー
  • neuron-x
  • ベストアンサー率52% (139/266)
回答No.1

MFCのCStringはUnicodeに対応しているようです。また、CFileでUnicodeのファイルを読み書きしても問題はありませんでした。 http://www.microsoft.com/japan/developer/library/vccore/_core_strings.3a_.unicode_and_multibyte_character_set_.28.mbcs.29_.support.htm CFile、CStringなど、MFCを使って処理されていますが、VC++.NETを使っているため、.NET Frameworkを使ってみるのはどうでしょうか?.NETはC#から使うのが一番ですが、C++からでも使用できます。 C++.NETでUnicodeファイルのRead/編集/Writeサンプル ------------------------------------------------------------------------------ #include "stdafx.h" #using <mscorlib.dll> using namespace System; using namespace System::IO; using namespace System::Text; int _tmain() {   // Unicodeでsample.txtを読み込み   StreamReader* sr = new StreamReader("sample.txt", Encoding::Unicode);   String* buffer = sr->ReadToEnd();   sr->Close();   // "&"を"&amp;"に変換   String* work = buffer->Replace("&", "&amp;");   // Unicodeでoutput.txtに書き込み   StreamWriter* sw = new StreamWriter("output.txt", Encoding::Unicode);   sw->Write(work);   sw->Close();   return 0; }

mkmarimo
質問者

補足

質問者のmkmarimoです。 neuron-xさん、丁寧な回答ありがとうございます。 欲しい答えがいただけ感謝しております。 ところで、補足質問が2点あります。 申し訳ありませんが、また時間があればご教授ください。 【補足質問1】 回答2行目の参考URLの内容ですが、VC++の設定をデフォルトのままで ビルドしてもUnicodeでのファイル保存はできないということでしょうか? 内容をじっくり読んでもあまり理解できませんでした。 申し訳ありません。 【補足質問2】 記載していただいているサンプルプログラムですが、 namespaceなどがありますが、C++なのでしょうか? あまり知識がなく申し訳ないのですが、C#のサンプルかと感じます。 以上。よろしくお願いします。

その他の回答 (3)

  • neuron-x
  • ベストアンサー率52% (139/266)
回答No.4

#1です。 □MFCでUNICODEを使う場合ですが、#3さんの回答が詳しいです。 (1) UNICODEを使用する宣言、または設定を行う(プロジェクトのプロパティ) (2) 型にTCHAR、LPTSTR、LPCTSTRをなどを使う。 □最初のサンプルはC++.NETを使った物です。  .NET Frameworkを使っているため、マネージドコードになります。  ちなみに、C#で同じプログラムを書くと、つぎのようになります。 using System; using System.IO; using System.Text; public class UnicodeIO {   static void Main(string[] args)   {     // Unicodeでsample.txtを読み込み     StreamReader sr = new StreamReader("sample.txt", Encoding.Unicode);     string buffer = sr.ReadToEnd();     sr.Close();     // "&"を"&amp;"に変換     string work = buffer.Replace("&", "&amp;");     // Unicodeでoutput.txtに書き込み     StreamWriter sw = new StreamWriter("output.txt", true, Encoding.Unicode);     sw.Write(work);     sw.Close();   } } 余談ですが、私も昔C++でMFCなどを使っていました。CStringやCFileなどMFCって便利だな~と思っていたのですが、C#を始めてからは「.NET Framework」って楽だな~と思うようになりました。C++で数十行書かないといけない処理が、C#では数行でかけてしまったりもします。(ただし、込み入った処理を書くときは今でもC++) 機会があれば、.NET FrameworkやC#についても調べてみてはいかがでしょうか?

mkmarimo
質問者

お礼

2度の丁寧な回答ありがとうございます。 neuron-xさんのお陰で何とかなりそうです。 本当にありがとうございました。

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.3

まずUNICODEにも色々な種類があることをご存知でしょうか? 一般的にWindowsのUNICODEはUCS2の事を指します。 これはWindowsXpならメモ帳で「Unicode」を指定して保存したのと同じものです。 ちなみに#1さんの方法はVC++で.net Frameworkを使った方法です。 でCString(MFC/ATL)でもUCS2を扱う事は可能なようです。 .net2003の場合ですが プロジェクトのプロパティの中に 文字セットという項目があるのでそこを「Unicode 文字セットを使用する」を選べば良いでしょう。 ところでC/C++でワイド文字を指定する場合 wchat_t str[6] = L"あいうえお"; というふうに文字リテラルの先頭にLをつけます。(vc++だけでなくgccやbccも共通) VC++でよくTCHARとかLPTSTC LPSTC LPWSTRという定義がでてきますが UNICODEが定義されていない場合 TCHAR→char LPTSTR→char* LPCTSTR→const char* LPSTR→char* LPWSTR→wchar_t* に置き換わりますがUNICODEが定義されていた場合 TCHAR→wchar_t LPTSTR→wchar_t* LPCTSTR→const wchar_t* LPSTR→char* LPWSTR→wchar_t* に置き換わります。 おまけですが tchar.hをincludeして CString A = _T("あいうえお"); とすれば UNICODE時は CString A = L"あいうえお"; そうでないときは CString A = "あいうえお"; となりUNICODEでもそうでない場合もコンパイルすることが可能になります。

mkmarimo
質問者

お礼

回答ありがとうございます。 お陰様で疑問が解消されました。 何とかなりそうなので質問を締め切らせていただきます。 丁寧にありがとうございました。

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

単にUnicodeといっても、ビッグエンディアンの場合もあるので、CStringで絶対大丈夫かというと、かなり微妙です。 もう少し用法の制約を厳しくするか、別の方法を考えた方がよさそうです。

mkmarimo
質問者

お礼

回答ありがとうございます。 考慮してプログラミングします。