Shift_JIS非対応文字の保存問題

[戻る]
確変 2012/12/22(土) 19:13:27
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非対応文字を検知するにはどうしたらいいでしょうか?

よろしくご教授お願いします。

tetrapod 2012/12/22(土) 21:08:58
VS2010 では CStringA (MBCS) と CStringW (UNICODE) を同時に使うことができる。
CStringW → CStringA → CStringW と2回変換してみるといい。
・元に戻る= CP932 で表現できる文字でのみ構成されている
・元に戻らない= CP932 で表現できない文字を含む

確変 2012/12/23(日) 09:13:28
[[解決]]
terapod 様、いつも有り難うございます。
簡単な方法を教えて戴き助かりました。
エディットボックスが沢山あって、入力のつど警告するのは厄介なので、保存時にメッ
セージを出すことにしました。

if (m_bUnicodeFile == FALSE)       // Shift_JISファイルの場合
{
    CStringA strA = sSave;
    CStringW strW = strA;
    if (strW.Compare(sSave) != 0)
    {
        AfxMessageBox(_T("警告"));
        return;
    }
    ・・・以下同じ

こんな具合で、動作確認できました。

古いスレッドには追加発言できません。