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;
}
・・・以下同じ
こんな具合で、動作確認できました。