全角半角変換、ひらがなカタカナ変換などの文字列変換をする

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);
}

プロジェクトファイルをダウンロード


カテゴリー「文字列操作」 のエントリー