LCMapStringを利用すると、全角文字を半角文字に変換したり、ひらがなをカタカナに置き換えることができる(これらの処理はLCMapStringを使わずとも簡単にできるのだが...)。
文字列操作はユニコードビルド時でも非ユニコード文字を扱わなければいけなかったり、その逆も多い。つまりTCHAR系で実装すると使い勝手が悪くなる。そのためここではユニコード用と非ユニコード用、両用の3種類を全ての変換処理に用意した。
依存環境:ATL#pragma once
#include "atlstr.h"
class CDnpStrConv
{
public:
//
// LCMapStringを利用したロケール依存の文字列変換)
//
bool StrConv(LPCTSTR pszSrc,CAtlString* pstrDest,DWORD dwFlags)
{
#ifdef _UNICODE
return StrConvW(pszSrc,pstrDest,dwFlags);
#else
return StrConvA(pszSrc,pstrDest,dwFlags);
#endif
}
//
// LCMapStringを利用したロケール依存の文字列変換)(非ユニコード用)
//
bool StrConvA(LPCSTR pszSrc,CAtlStringA* pstrDest,DWORD dwFlags)
{
char* pszBuff;
int nLen;
int ret;
LCID dwLocale;
if(pstrDest == NULL)
return false;
*pstrDest = _T("");
if(pszSrc == NULL)
return false;
//dwLocale = ::GetUserDefaultLCID(); //このクラス内では日本語用の変換処理しか利用しないので日本用の1041に固定している!
dwLocale = 1041; //中国語など多言語用の変換処理を利用するにはそのロケールもしくはUserDefaultを指定すること
nLen = ::LCMapStringA(dwLocale,dwFlags,pszSrc,-1,NULL,0);
nLen += 10;
pszBuff = new char[nLen];
ret = ::LCMapStringA(dwLocale,dwFlags,pszSrc,-1,pszBuff,nLen);
if(ret == 0)
{
delete pszBuff;
return false;
}
*pstrDest = pszBuff;
delete pszBuff;
return true;
}
//
// LCMapStringを利用したロケール依存の文字列変換)(ユニコード用)
//
bool StrConvW(LPCWSTR pszSrc,CAtlStringW* pstrDest,DWORD dwFlags)
{
WCHAR* pszBuff;
int nLen;
int ret;
LCID dwLocale;
if(pstrDest == NULL)
return false;
*pstrDest = _T("");
if(pszSrc == NULL)
return false;
//dwLocale = ::GetUserDefaultLCID(); //このクラス内では日本語用の変換処理しか利用しないので日本用の1041に固定している!
dwLocale = 1041; //中国語など多言語用の変換処理を利用するにはそのロケールもしくはUserDefaultを指定すること
nLen = ::LCMapStringW(dwLocale,dwFlags,pszSrc,-1,NULL,0);
nLen += 10;
pszBuff = new WCHAR[nLen];
ret = ::LCMapStringW(dwLocale,dwFlags,pszSrc,-1,pszBuff,nLen);
if(ret == 0)
{
delete pszBuff;
return false;
}
*pstrDest = pszBuff;
delete pszBuff;
return true;
}
//
// メンバー関数定義用一時マクロ
//
#define FN_STRCONV_EXTEND(func_dualchar,func_charA,func_chcarW,dwFlags) \
bool func_dualchar(LPCTSTR pszSrc,CAtlString* pstrDest) \
{ \
return StrConv(pszSrc,pstrDest,dwFlags); \
} \
bool func_charA(LPCSTR pszSrc,CAtlStringA* pstrDest) \
{ \
return StrConvA(pszSrc,pstrDest,dwFlags); \
} \
bool func_chcarW(LPCWSTR pszSrc,CAtlStringW* pstrDest) \
{ \
return StrConvW(pszSrc,pstrDest,dwFlags); \
} \
bool func_dualchar(CAtlString& strText) \
{ \
return func_dualchar((CAtlString)strText,&strText); \
} \
bool func_charA(CAtlStringA& strText) \
{ \
return func_charA((CAtlStringA)strText,&strText); \
} \
bool func_chcarW(CAtlStringW& strText) \
{ \
return func_chcarW((CAtlStringW)strText,&strText); \
}
// 半角全角変換
FN_STRCONV_EXTEND(Zen2Han,Zen2HanA,Zen2HanW,LCMAP_HALFWIDTH)
//全角半角変換
FN_STRCONV_EXTEND(Han2Zen,Han2ZenA,Han2ZenW,LCMAP_FULLWIDTH)
//カタカナひらがな変換
FN_STRCONV_EXTEND(Katakana2Hiragana,Katakana2HiraganaA,Katakana2HiraganaW,LCMAP_HIRAGANA)
FN_STRCONV_EXTEND(Kana2Hira,Kana2HiraA,Kana2HiraW,LCMAP_HIRAGANA)
//ひらがなカタカナ変換
FN_STRCONV_EXTEND(Hiragana2Katakana,Hiragana2KatakanaA,Hiragana2KatakanaW,LCMAP_KATAKANA)
FN_STRCONV_EXTEND(Hira2Kana,Hira2KanaA,Hira2KanaW,LCMAP_KATAKANA)
//小文字大文字変換
FN_STRCONV_EXTEND(MakeUpper,MakeUpperA,MakeUpperW,LCMAP_UPPERCASE)
//大文字小文字変換
FN_STRCONV_EXTEND(MakeLower,MakeLowerA,MakeLowerW,LCMAP_LOWERCASE)
//マクロ定義の削除
#undef FN_STRCONV_EXTEND
};
void Test(void)
{
bool ret;
CAtlString strMessage;
CDnpStrConv cCnv;
ret = cCnv.MakeLower(_T("あいうABCDXYZ123"),&strMessage);
if(ret)
::MessageBox(NULL,strMessage,_T(""),MB_OK);
ret = cCnv.Zen2Han(strMessage);
if(ret)
::MessageBox(NULL,strMessage,_T(""),MB_OK);
ret = cCnv.MakeUpper(strMessage);
if(ret)
::MessageBox(NULL,strMessage,_T(""),MB_OK);
ret = cCnv.Hira2Kana(strMessage);
if(ret)
::MessageBox(NULL,strMessage,_T(""),MB_OK);
ret = cCnv.Kana2Hira(strMessage);
if(ret)
::MessageBox(NULL,strMessage,_T(""),MB_OK);
}
