博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
中文字符串分隔的注意问题
阅读量:5164 次
发布时间:2019-06-13

本文共 1831 字,大约阅读时间需要 6 分钟。

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

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

  分隔函数如下:

  

vector
sepstr(const string &sStr, const string &sSep, bool withEmpty){ vector
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

转载于:https://www.cnblogs.com/pigerhan/archive/2012/09/13/2683494.html

你可能感兴趣的文章
Linux 学习1
查看>>
hadoop学习笔记(五):java api 操作hdfs
查看>>
曲苑杂坛--清除维护计划产生的日志文件
查看>>
『教程』L0、L1与L2范数
查看>>
重楼C++辅助是如何炼成的培训教材
查看>>
PHP 中文正则
查看>>
常用数据库 JDBC URL 格式
查看>>
jQuery中的$.grep()使用
查看>>
windows更新升级失败问题
查看>>
一致性哈希算法(consistent hashing)(转载)
查看>>
Caliburn Micro 框架 WP8使用研究(三)墓碑处理
查看>>
C++ const
查看>>
strults2标签s:set的用法
查看>>
scikit-learn——快速入门 - daniel-D(转)
查看>>
python中unicode、utf8、gbk等编码问题
查看>>
test
查看>>
近期一份工作的总结
查看>>
CheckBox和RadioButton以及RadioGroup
查看>>
Android 实现环形进度按钮circular-progress-button
查看>>
UINavigationController
查看>>