中文字符串分隔的注意问题

  今天终端的同学反映模糊匹配算法初始化时crash了。跟了一下,发现是对中文的字符串分隔时出的问题。

  基本的流程是这样的:首先加载配置文件(配置文件中的内容每一行用|分隔,比如:桂皮猪|10086),然后对每一行用|分隔提取参数,在进行相应的处理。

  分隔函数如下:

  

vector<string> sepstr(const string &sStr, const string &sSep, bool withEmpty)
{
    vector<string> vt;

    string::size_type pos = 0;
    string::size_type pos1 = 0;

    while(true)
    {
        string s;

        pos1 = sStr.find_first_of(sSep, pos);
        if(pos1 == string::npos)
        {
            if(pos + 1 <= sStr.length())
            {
                s = sStr.substr(pos);
            }
        }
        else if(pos1 == pos)
        {
            s = "";
        }
        else
        {
            s = sStr.substr(pos, pos1 - pos);
            pos = pos1;
        }

        if(withEmpty)
        {
            vt.push_back(s);
        }
        else
        {
            if(!s.empty())
            {
                vt.push_back(s);
            }
        }

        if(pos1 == string::npos)
        {
            break;
        }

        pos++;
    }

    return vt;
}

  问题出在这一行:pos1 = sStr.find_first_of(sSep, pos);

  比如我输入是“王珅|10086”,而王珅的gbk编码是:CDF5AB7C,“|”的ASCII码也是7C,这该行被分隔成了:CDF5AB 和10086,显然后续的处理就出错了。

  处理的方法是修改find_first_of函数,对汉字跳过,因为我们分隔符一般不会用汉字。具体如下:

size_t findFirstOf(const string& sStr, const string& sSep, size_t pos)
{
    //find first of sSep
    for (size_t i = pos; i < sStr.size(); i++)
    {
        if(IS_DOUBLE_CHAR( (unsigned char)(sStr.at(i))) )
        {
            i++;

            if (i == sStr.size())
            {
                break;
            }
        }
        else
        {
            for (size_t j = 0; j < sSep.size(); j++) 
            {
                if (sStr[i] == sSep[j])
                {
                    return i;
                }
            }
        }
    }

    return string::npos;
}

 

  OVER

posted @ 2012-09-13 15:57  桂皮猪  阅读(364)  评论(0编辑  收藏  举报