C++实现对汉字的完美支持
2019独角兽企业重金招聘Python工程师标准>>>
// TString.cpp: implementation of the CTString class.
//
//
/**
* <p>Title: CTSring 类</p>
* <p>Description: 改写CString 的Left(),Right(),Mid(),GetLength()方法</p>
* <p>Copyright: Copyright (c) 2011</p>
* <p>QQ:372198960 </p>
* @author 俊
* @Date 2011-09-22
* @version 1.0
*/
#include "stdafx.h"
#include "test11.h"
#include "TString.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//
// Construction/Destruction
//
CTString::CTString(CString sstr)
{
this->str=sstr;
}
CTString::CTString()
{
this->str="";
}
CTString::~CTString()
{
}
CString CTString::Mid(long nFirst)
{
CTString tt=this->str;
long len=tt.GetLength();
return tt.Right(len-nFirst);
}
CString CTString::Mid(long nFirst,long nCount)
{
CTString tt=this->str;
long len=tt.GetLength();
tt=tt.Right(len-nFirst);
return tt.Left(nCount);
}
CString CTString::Right(long nCount)
{
long size=this->GetLength();
if(size==0 || nCount<=0){return "";}
if(nCount>=size){return this->str;}
char *m_firstBuffer=new char[1];
char *m_secondBuffer=new char[1];
LPSTR firstc=m_firstBuffer;
LPSTR secondc=m_secondBuffer;
char TCbuf[1024];
CString ret;
long vi=size-nCount,itemp=0,i=0,j=0;
while(itemp<vi)//确定i的位置
{
*firstc=this->str.GetAt(i);
*secondc=this->str.GetAt(i+1);
if((unsigned char)*firstc>=0xa1 && (unsigned char)*secondc>=0xa1) //两个字节都>=0xa1是汉字
{
i+=2;
}else{
i++;
}
itemp++;
}
vi=0;
while(vi<nCount)
{
*firstc=this->str.GetAt(i);
if(i+1<this->str.GetLength())
*secondc=this->str.GetAt(i+1);
else
*secondc=0x00; //如果越界了就赋个小于0xa1的值
if((unsigned char)*firstc>=0xa1 && (unsigned char)*secondc>=0xa1) //两个字节都>=0xa1是汉字
{
TCbuf[j]=*firstc;
TCbuf[j+1]=*secondc;
j+=2;
i+=2;
}else{
TCbuf[j]=*firstc;
j++;
i++;
}
vi++;
}
TCbuf[j]='\0';
ret.Format("%s",TCbuf);
return ret;
}
///左截取
CString CTString::Left(long nCount)
{
long size=this->GetLength();
if(size==0 || nCount<=0){return "";}
if(nCount>=size){return this->str;}//如果截取的长度大于等于本身长度,则返回自身。
char *m_firstBuffer=new char[1];
char *m_secondBuffer=new char[1];
LPSTR firstc=m_firstBuffer;
LPSTR secondc=m_secondBuffer;
char TCbuf[1024];
CString ret;
long i=0,j=0,vi=0;
//i 对单个字节的游标
//j 存储截取的字节的游标
//vi 截取长度的游标
while(vi<nCount)
{
*firstc=this->str.GetAt(i);
*secondc=this->str.GetAt(i+1);//左截取不会越界的。因为如果i到了最后一个的话说明截取的长度大于等于本身长度,那么之前就已经返回了。
if((unsigned char)*firstc>=0xa1 && (unsigned char)*secondc>=0xa1) //汉字
{
TCbuf[j]=*firstc;
TCbuf[j+1]=*secondc;
j+=2;
i+=2;
}else{//非汉字
TCbuf[j]=*firstc;
j++;
i++;
}
vi++;
}
TCbuf[j]='\0';
ret.Format("%s",TCbuf);
return ret;
}
/获取字符串长度,汉字为一个字符
long CTString::GetLength()
{
long size=this->str.GetLength();
if(size==0) return 0;
char *m_firstBuffer=new char[1];
char *m_secondBuffer=new char[1];
LPSTR firstc=m_firstBuffer;
LPSTR secondc=m_secondBuffer;
long i=0;
long vlen=0;
while(i<size)
{
*firstc=this->str.GetAt(i);
if(i+1<this->str.GetLength())
*secondc=this->str.GetAt(i+1);
else
*secondc=0x00; //如果越界了就赋个小于0xa1的值
if((unsigned char)*firstc>=0xa1 && (unsigned char)*firstc>=0xa1) //两个字节都是是汉字字节
{
i+=2;
vlen++;
}
else
{
i+=1;
vlen++;
}
}
return vlen;
}
转载于:https://my.oschina.net/u/208393/blog/35925
C++实现对汉字的完美支持相关推荐
- thinkphp5整合系列之汉字转拼音完美支持多音字
thinkphp5整合系列之汉字转拼音完美支持多音字 1.进入thinkphp5项目的根目录,用composer 安装扩展 2.接下来需要做的事就是在控制器中引入 /vendor/overtrue/p ...
- QtCreator动态编译jsoncpp完美支持x86和arm平台
如果是做嵌入式开发. 在Qt下支持JSon最好的办法,可能不是采用qjson这个库.QJson这个库的实例只提供了x86环境下的编译方法. Installing QJson ------------- ...
- html支持1080p,1080p完美支持
1080p完美支持 ●1080p完美支持 3D电视+JBL音箱,不配个蓝光机真是"白瞎"了这一套,对于3D电视和7.1声道的影院,都属于比较超前的配置,一般的蓝光机肯定是不能满足需 ...
- PHP生成PDF完美支持中文,解决TCPDF乱码
PHP生成PDF完美支持中文,解决TCPDF乱码 2011-09-26 09:04 418人阅读 评论(0) 收藏 举报 phpfontsheaderttfxhtml文档 PHP生成PDF完美支持中文 ...
- Towxml 3.0来了,让小程序完美支持Markdown
Towxml 3.0来了,让小程序完美支持Markdown 查看全文 http://www.taodudu.cc/news/show-805307.html 相关文章: 数据接口的登录态校验以及JWT ...
- scss2css vscode设置_VSCode下让CSS文件完美支持SCSS或SASS语法方法
VSCode下让CSS文件完美支持SCSS或SASS语法方法 习惯Webpack + PostCSS后, 通常PostCSS都是直接对CSS文件进行处理, 但是大部分习惯SCSS/SASS/LESS的 ...
- 泡泡提示加强版 完美支持XHTML(JavaScript)--zhuan
from :http://ayi.ck97.com/post/190.html 随着WEB标准化的进程,网站正在逐渐向XHTML过渡,在这个过程中,也慢慢发现了非常多的问题. 原先的泡泡提示组件就已经 ...
- 让vscode完美支持go vendor的代码跳转(使用vscode必看)
Vscode是世界上最好的Go IDE!! 所以使用vscode作为Go的IDE是一件非常爽的事情. 可是事情总有不完美.现在有很多项目都是用vendor来做第三方包的版本控制,可是godef竟然不支 ...
- 差之毫厘:etcd 3 完美支持 HTTP 访问
etcd 升级到 3.x 版本后,其对外 API 的协议从普通的 HTTP1 切换到了 gRPC.为了兼顾那些不能使用 gRPC 的特殊群体,etcd 通过 gRPC-gateway 的方式代理 HT ...
最新文章
- 【java】将自己写的类生成说明文档的方法
- Java练习 SDUT-1230_平方和与立方和
- Python内置函数查询表——总结篇
- JavaScript中map函数和filter的简单举例
- insertAfter()
- SPI驱动0.96/1.3寸 OLED屏幕,易修改为DMA控制
- redis中文显示问题
- python成绩统计_python统计考试成绩代码参考
- 否极泰来?中国恒大暴涨17% 恒大汽车涨超6%
- Ubuntu snap for 树莓派
- 缺少winload.efi”的解决办法
- linux 远程安装teamviewer,如何在CentOS 7上安装TeamViewer
- AndroidStudio 编译报错 abc_list_selector_disabled_holo_light.9.png
- 用计算机运算符编写检索式,在计算机检索中,常用的布尔逻辑算符有哪几种
- Poker time 2 (enhanced version)
- 万能的尾盘选股技巧!今日学明天买,后天稳健盈利!短线炒股一定要收藏!
- 20210323第一家量产国产化蓝牙AOA高精度定位基站生态合能培训会上海站现场直播下午内容视频录像回放-深圳核芯物联原厂工程师罗良技术分享
- 实验四-1:输入一个字符,请判断是字母、数字还是其它字符。
- 专业C/C++程序员的培养路线
- 解决惠普打印机可以打印出PIN码但是输入码无效连接失败的问题
热门文章
- 设计模式的征途—2.简单工厂(Simple Factory)模式
- linux -cpu
- Strtus2工作流程及原理
- Github管理Eclipse分布式项目
- 剖析context:component-scan/、mvc:annotation-dri...
- 3Com发布新MSR路由器 为企业提供视频播客支持
- 我们在雪地撒野——51cto众人滑雪图片集
- jinja2的转义详解
- Django报错SocialApp matching query does not exist以及Django的SITE_ID = 1的含义
- 虛擬機xp中安裝幸福之家3.23