Windows 7, Visual Studio 2010, VC++, ダイアログベース, ”Unicode文字セットを使
用する”です。
テキストデータを CSVファイルに保存するアプリを作っています。
Shift_JIS と、Unicode と、選んで保存できるようにしています。
コードの一部を下に示します。
CString sSave = _T(○○○○);    // ○○○○は CSV形式のテキスト
if (m_bUnicodeFile == FALSE)       // Shift_JISファイルの場合
{
    CStdioFile sf;
    _wsetlocale(LC_ALL, _T(jpn));
    sf.Open(m_sFileName, CFile::modeCreate | CFile::modeWrite);
    sf.WriteString(sSave);
    sf.Close();
    _wsetlocale(LC_ALL, _T("));
}
else                               // Unicodeファイルの場合
{
    CFile f;
    f.Open(m_sFileName, CFile::modeCreate | CFile::modeWrite);
    f.Write(sSave, sSave.GetLength() * sizeof(TCHAR));
    f.Close();
}
通常はこれで問題なく動作しています。
ところが、○○○○の中に Shift_JIS非対応の文字が入っていると、Shift_JISファイル
保存の場合、その文字以降が保存されません。末尾の改行コードも消えるので、CSVファ
イルとして使えなくなります。
Shift_JIS非対応の文字の例:☎
これは電話の絵文字です。MS-IMEで「でんわ」で漢字変換すると出ます。
エディットボックスに Shift_JIS非対応文字が入力された時点で警告を発するようにし
たいのですが、Shift_JIS非対応文字を検知するにはどうしたらいいでしょうか?
よろしくご教授お願いします。
VS2010 では CStringA (MBCS) と CStringW (UNICODE) を同時に使うことができる。
CStringW → CStringA → CStringW と2回変換してみるといい。
・元に戻る= CP932 で表現できる文字でのみ構成されている
・元に戻らない= CP932 で表現できない文字を含む
terapod 様、いつも有り難うございます。
簡単な方法を教えて戴き助かりました。
エディットボックスが沢山あって、入力のつど警告するのは厄介なので、保存時にメッ
セージを出すことにしました。
if (m_bUnicodeFile == FALSE)       // Shift_JISファイルの場合
{
    CStringA strA = sSave;
    CStringW strW = strA;
    if (strW.Compare(sSave) != 0)
    {
        AfxMessageBox(_T(警告));
        return;
    }
    ・・・以下同じ
こんな具合で、動作確認できました。

 
  
  
  
  