GBK中文编码和std::string的冲突问题

最近写了一个按照分隔符拆分字符串的接口,
void PickUp(std::string &strDes,std::vector<std::string>

&vecData,const std::string sign=";" )
{
 std::string::size_type fpos=0,bpos=0;
 std::string strTemp;
 while(bpos != std::string::npos && strDes.size())
 {
  bpos = strDes.find(sign,fpos);
  strTemp = strDes.substr (fpos,bpos-fpos);
  vecData.push_back (strTemp);
  fpos = bpos+1;
 }
}
开始用得挺舒服没有出现问题,但是后来出现了一个新的需求又用到这个接口,但是分隔符不再是默认的";",而是换成了下划线"_"。这时问题出现了:比如下代码
int main()
{
 std::string strDes("開关_電視臺");
 std::vector<std::string> vecTemp;
 PickUp(strDes,vecTemp,"_");
 system("pause");
 return 0;
}
粗看可能看不出什么问题,但是结果是错误的,仔细断点跟踪并网上查阅了相关资料,终于弄懂原因了。
std::string 的find函数是按照单字节查找对比的,而GBK 采用双字节表示,总体编码范围为 0x8140-FEFE,首字节在 0x81-FE 之间,尾字节在 0x40-FE 之间
而開字的内存数据为e9 5f,臺字的内存数据为c5 5f,下划线"_"的内存为5f,也就是说開字的尾字节和下划线ascii"_"是一样的,不行的是std::string 的find是采用单字节查找的,所以出现的结果是vecTemp的size()变成了4,其中包括两个空的字符串,而不是预期的结果2;而之前没有出问题是因为分隔符分号的缘故";",";"的ascii码是小于0x40的。
所以解决此种问题的办法就是分隔符应该去小于0x40也就是ascii码小于64的,至于哪些小于64就需自己去查了
或者可以自己写个单字节比较find算法.....

 

boost::tokenizer不错

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值