博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
带汉字的字符串分段
阅读量:5923 次
发布时间:2019-06-19

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

hot3.png

带汉字的字符串分段 

      在多字节环境下,假设一个长字符串(包括字母符号和汉字)需要分段,默认按每137个字节为一段分成小串,即indexFenPian=137,但不能将汉字拆分,如遇到汉字拆分的情况可以将此串分为(137上下浮动一个字节)个字节为一段,求实际中每次分片的indexFenPian值:

(利用汉字的两个字节都是高位为1来进行)

indexFenPian=137;int isHanFlag=0;for (int i=136;i>=0;i--) //从分片处向前遍历,汉字的两个字节都是高位为1{if(!(chatText[i]&0x80))  //如果遇到第一个非高位为1的,也就是非汉字的蹦出{  break;}isHanFlag++;             //累计连续汉字的字节总数}if (isHanFlag%2!=0)      //如果累计连续汉字的字节总数是奇数则说明有拆分汉字情况{indexFenPian=indexFenPian-1;}
---------------------------------------------------

//  带汉字的字符串分段 

void CQtoolsDlg::OnButton2() 
{
 UpdateData(true);
 CString   str=m_str; 
    CString   c[3]={""}; //字符串分3段
    int   len   =   str.GetLength(); 
 int j;
 CString m_slen;
 m_slen.Format("%d",len);
 
  for(int  i  =  0;i <len;i++) 
  {  
   if(   str[i]  &  0x80) //如果属于汉字的高位 位运算该处为汉字
   {   if (i<=29)
     j=0;
    else if(i<=58)
     j=1;
    else
     j=2;
    c[j]+=str.Mid(i,2);  //mid来获取指定位置的字符,从i开始的2位
    i++; 
    
   } 
   else
   {   if (i<=29)
     j=0;
    else if(i<=58)
     j=1;
    else
     j=2;
    c[j]+=str[i];
   }
   
   } 
        
 MessageBox(c[0]+"\r\n"+c[1]+"\r\n"+c[2]+"\r\n", "字符个数  "+m_slen,MB_OK);
}

 

 

 

 

//测试功能/

void CQtoolsDlg::OnButton3() 

{
 // TODO: Add your control notification handler code here
 CString   str= "中s国qqq人民解放d军s123 "; 
    CString   c1; 
    int   len   =   str.GetLength(); 
 for(int   i   =   0;i <len;i++) 
 { 
    //如果属于汉字的高位  
   //汉字高位为1  // 01111111 -- 11111111  // 0x 7f--  0x ff 
    if(   str[i]   &   0x80) //位运算该处为汉字
  { 
   
   c1+=str.Mid(i,2);  //mid来获取指定位置的字符,从i开始的2位
   i++; 
  
  } 
    else
    {
    c1+=str[i];
    }
  
   } 
 MessageBox(c1,MB_OK);
 
}

//测试功能/

void CQtoolsDlg::OnButton4() 

{
 UpdateData(true);

 CString   str= "我"; 

    CString   changestr,changestr1; 
    int   len   =   str.GetLength(); 
 /*
 for(int i  = 1;i <len;i++) 
  { 
    changestr+=str[i];
  } 
 */
changestr.  Format("%x",m_one[0]);  //文本字符串
changestr1. Format("%x",m_one[1]);
 MessageBox(changestr+"\r\n"+changestr1,MB_OK);
 
}

-----------------------------------------

C++判断一个char字符串,下标为N是不是汉字.

思路:
C++中的通用方法是判断这个char的最高位是不是为1,因为英文字符的值一定小于0x80,即最高们是0,而中文字符(所占的两个字符都是)的最高位是1.
(但有些特殊字符也是1,比如:★(A1EF、U+2605)等等这些字符。应当注意).

//代码示例:
char * str[50] = “test!我们test.”;

if(str[i] & 0x80 )

    // 下标为 i 是个中文字符(或半个中文字符);
else
    // 下标为 i 是个英文字符;

//下面是我常用的取字符串位置的函数

int GetCharPos(const string &str, int pos)
{
    int i = 0;
    for (; i < (int)str.size() && i < pos; ++i)
    {
        if (str[i] & 0x80)
            ++i;
    }
    return i;
}

--------------------------

    

转载于:https://my.oschina.net/ypimgt/blog/94377

你可能感兴趣的文章
闹钟应用功能简介
查看>>
img图片在webpack中使用
查看>>
四大组件之一 CotentProvider
查看>>
PDF Puppeteer Error
查看>>
Python基础入门教程:Day21-30/Web前端概述
查看>>
Git安装以及常用命令(图文详解)
查看>>
第二天 web 笔记
查看>>
ERC1400提案中文版,关于ERC的新成员,你想要知道的都在这里了
查看>>
C++ 学习笔记之——文件操作和文件流
查看>>
同步和死锁
查看>>
flutter系列集合之App项目集成flutter混合开发详细指南大神必学
查看>>
前端的技术栈是如何规划和演进的
查看>>
设计模式之工厂方法模式
查看>>
配置 babel 支持对象扩展运算符、class 直接赋值变量等新特性
查看>>
HTML5 新标签
查看>>
iOS 使用百度地图进行定位和路线规划
查看>>
用python写一个workflow百度翻译插件
查看>>
动态配置LauncherActivity/根据不同资源文件生成apk
查看>>
沸点2.0更新,“有趣”又“有料”
查看>>
typescript 基础
查看>>