zoukankan      html  css  js  c++  java
  • 中文字符串分隔的注意问题

      今天终端的同学反映模糊匹配算法初始化时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

  • 相关阅读:
    你应该了解Nginx的7个原因
    linux 中php以及nginx的重启命令
    HTTP 长连接和短连接
    git常用命令
    Linux 防火墙开放特定端口 (iptables)
    redis配置文件相关
    关于解决emoji表情的存储
    文件内容统计——Linux wc命令
    Git 服务器搭建
    关于微信二次分享,描述变链接的解决方法(一)----文档说明
  • 原文地址:https://www.cnblogs.com/pigerhan/p/2683494.html
Copyright © 2011-2022 走看看