半角/全角の相互変換

文字列内の半角を全角に変換したい場合や、その逆のケースと言うのはちょくちょくあります。
私は下記のようなサブルーチンを作っています。
このサブルーチンでは、変換に失敗した場合に空文字列を返しています。
対象文字列を参照型で渡して、戻り値をbool型にするというのもいいのかな、と思います。

AnsiString __fastcall subExchangeString(AnsiString strDATA,int iTYPE)
{
    //  文字列を半角<->全角間で変換を行う。
    //      iType : 1.全角->半角      2.半角->全角
    AnsiString strDT;
    char *buf;
    int i;

    try    {
        strDT = strDATA;

        //  バッファメモリの確保
        if (iTYPE == 1)
            i = CharLen(strDT.c_str()) + 2;     //  全角 -> 半角
        else
            i = CharLen(strDT.c_str()) * 2 + 2; //  半角 -> 全角
        buf = (char*)malloc(i);

        if (!strDT.IsEmpty())   {
            //  変換処理の実行
            switch (iTYPE)  {
                case 1:     //  全角->半角
                    ::LCMapString(GetUserDefaultLCID(),LCMAP_HALFWIDTH,strDT.c_str(),
                                                            strDT.Length() + 1,buf,i);
                    break;
                case 2:     //  半角->全角
                    ::LCMapString(GetUserDefaultLCID(),LCMAP_FULLWIDTH,strDT.c_str(),
                                                            strDT.Length() + 1,buf,i);
                    break;
                default:    //  無変換
                    strcpy(buf,strDATA.c_str());
            }

            //  変換結果文字列を変数に格納
            strDT = AnsiString(buf);

            switch (iTYPE)  {
                case 1:     //  変換結果に全角が含まれているかチェックする
                    for (i = 1;i < strDT.Length();i++) {
                        if (strDT.IsLeadByte(i))    {
                            //  全角文字が含まれる
                            strDT = "";
                            break;
                        }
                    }
                    break;
                case 2:     //  変換結果に半角が含まれているかチェックする
                    for (i = 1;i < strDT.Length();i++) {
                        if (strDT.ByteType(i) == mbSingleByte)  {
                            //  半角文字が含まれる
                            strDT = "";
                            break;
                        }
                    }
                    break;
            }
        }

        //  バッファの解放
        free(buf);
    }
    catch(...)    {
        strDT = "";
    }

    //  変換結果を戻す
    return(strDT);
}

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-12-09 (日) 22:30:53 (3004d)