作者: 字体:[增加 减小] 类型:转载 时间:2013-05-03 我要评论

C++中汉字字符串的截取,需要的朋友可以参考一下

1、

复制代码代码如下:

const char *str = "test测试test";
while(*str)
{
//这里只需要判断第一个字节大于0x80就行了,前提是输入的是合法的GBK字符串
//原因在于,如果第一个字节大于0x80,那么它必然和后面一个字节一起组成一个汉字
//所以就没有必要再去判断后面一个字节了
//再强调一下,前提条件是输入合法的GBK字符串
if(*str > 0x80)
{
// 汉字,计数器++
str += 2;//是汉字自然就该直接+2了
}
else
{
str++;
}
}

2、

参看下面的字符串转换函数。

复制代码代码如下:

/** 
* 用getBytes(encoding):返回字符串的一个byte数组 
* 当b[0]为 63时,应该是转码错误 
* A、不乱码的汉字字符串: 
* 1、encoding用GB2312时,每byte是负数; 
* 2、encoding用ISO8859_1时,b[i]全是63。

* B、乱码的汉字字符串: 
* 1、encoding用ISO8859_1时,每byte也是负数; 
* 2、encoding用GB2312时,b[i]大部分是63。 
* C、英文字符串 
* 1、encoding用ISO8859_1和GB2312时,每byte都大于0; 
* 总结:给定一个字符串,用getBytes("iso8859_1") 
* 1、如果b[i]有63,不用转码; A-2 
* 2、如果b[i]全大于0,那么为英文字符串,不用转码; B-1 
* 3、如果b[i]有小于0的,那么已经乱码,要转码。 C-1 
*/ 
private static String toGb2312(String str) { 
if (str == null) return null; 
String retStr = str; 
byte b[]; 
try { 
b = str.getBytes("ISO8859_1");

for (int i = 0; i < b.length; i++) { 
byte b1 = b[i]; 
if (b1 == 63) 
break; //1 
else if (b1 > 0) 
continue;//2 
else if (b1 < 0) { //不可能为0,0为字符串结束符 
retStr = new String(b, "GB2312"); 
break; 


} catch (UnsupportedEncodingException e) { 
// e.printStackTrace(); 

return retStr; 
}

3、

复制代码代码如下:

unsigned char *str = "test测试test";
int length;
int i;

length = strlen(str);
for (i = 0; i < length - 1; i++)
{
if ( *str >= 0x81 && *str <= 0xFE
&& *(str + 1) >= 0x40 && *(str + 1) <= 0xFE)
{
// 汉字
}
}

unsignedchar*str="test测试test";//把字符串换成“汉A”试试,结果为2

有人说:“一个GBK汉字要占两个char空间(二字节),而且第一个字节里的值是小于0的。可以据此判断是否为汉字。”
1、为什么第一个字节的值小于0呢?
2、如果仅通过判断第一个字节如果小于0,则该字节和下一个字节就组成一个汉字,这种逻辑是否保险?
3、因为还看到有人说,GBK编码的汉字有高位和低位两位,第一个是低位吧?需要第一个字节在160-254之间,第二个字节在64-254之间,这样是不是比2中提到的方法要保险?
4、如果DB中的字符集是SIMPLIFIED CHINESE_CHINA.ZHS16GBK,这个是GBK字符集?GBK兼容GB2312

似乎有些字符集中有些汉字占三个字节

“通过判断第一个字节如果小于0,则该字节和下一个字节就组成一个汉字”

//GBK汉字内码范围
//81-A0 ,40-7E 80-FE
//AA-AF ,40-7E 80-A0
//B0-D6 ,40-7E 80-FE
//D7 ,40-7E 80-F9
//D8-F7 ,40-7E 80-FE
//F8-FE ,40-7E 80-A0
例如://81-A0 ,40-7E 80-FE
表示字符的ascii码要在129-160,64-126,128-254这三个区间段内

4、 
在工作中,遇到要截取字符串在屏幕上显示出来,因为字符串带有汉字,如果截取不好,会引起乱码,写了下面的函数

在uclinux下与VC6.0中测试可以通过。

view plaincopy to clipboardprint?

复制代码代码如下:

 /*截取字符串

name :要截取的字符串

store:要存储的字符串

len:要截取的长度

*/

void split_name( char * name , char * store , int len ) 
 {

int i= 0 ;

char strTemp[L(NAMEL)]={0};

if ( strlen(name)
     {

strcpy( store, name );  *name=0;

return ;

}

//从第1个字节开始判断

while( i < len )

{

if ( name[i]>>7&1 && name[i+1]>>7&1 )       //if ( name[i] < 0 && name[i+1] < 0 )

i = i + 2 ;

else

i = i + 1 ;

}

i = i > len ? i-3 :i-1;

strncpy( store , name , i+1 ); //截取前i+1位

*(store+i+1)=0;

strcpy( strTemp , name + i + 1 );

strcpy( name , strTemp );

}

C++中汉字字符串的截取相关推荐

  1. python字符串截取方法_如何使用python语言中的字符串方法截取字符串

    在我们使用python语言中的字符串方法时,可能会判断某个字符串是否以什么开头,可以使用什么进行截取等.下面利用几个实例说明字符串中的方法的用法,操作如下: 工具/原料 python 截图工具 方法/ ...

  2. sql中特殊字符串的截取

    假设列STD123中的一个值为:1803|123|456|789|147|258|369|159|753|951|357|222: 我想取最后三列的值,即为:|951|357|222 SELECT S ...

  3. python中字符串切片取奇数_Python中的字符串切片(截取字符串)的详解

    Python中的字符串切片(截取字符串)的详解 字符串索引示意图 字符串切片也就是截取字符串,取子串 Python中字符串切片方法 字符串[开始索引:结束索引:步长] 切取字符串为开始索引到结束索引- ...

  4. ***PHP各种编码的汉字字符串截取

    虽然PHP有现成的截取字符串函数substr(),但是这个函数不能对汉字字符串进行截取,要实现这种效果还需要我们自己去编写相应的函数.汉字有多种编码,比如GB2312,UTF-8等,汉字字符串的截取需 ...

  5. php返回第一个字符串的码点_PHP 字符串编码截取函数

    一个效率更高的全半角字符串截取函数 [原创,转载请注明:[url]http://wfyang.blog.51cto.com[/url]]现在流传的那几个字符串截取函数,一般都是对字符串进行循环判断,如 ...

  6. JAVA 中字符串的截取,要求不能截取半个汉字

    http://www.360doc.com/content/12/1126/16/1542811_250345184.shtml 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的 ...

  7. php获取汉字的长度,php中处理汉字字符串长度:strlen和mb_strlen

    PHP内置的字符串长度函数strlen()无法正确处理中文字符串,它得到的只是字符串所占的字节数.对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍 ...

  8. c语言中有裁剪字符串的函数吗,C语言中的字符串截取函数

    /*======================================================== 子数整数 源程序名 num.??? (pas,c,cpp) 可执行文件名 num. ...

  9. java中截取后几位字符串_java截取字符串后几位

    java中常用的字符串的截取方法_计算机软件及应用_IT/计算机_专业资料.jsp中常见使用技术,js,jstl,eclipse,java 1.length() 字符串的长度 例:char chars ...

  10. 求字符串中汉字的个数

    一.分解字符串法 首先创建这个函数: /*将字符串分解*/ create function [dbo].[SplitChar] ( @str_One Nvarchar(100) ) returns @ ...

最新文章

  1. python print 输出到txt_Python的print()输出形式
  2. Linux上搭建Samba,实现windows与Linux文件数据同步
  3. (翻译)Tricks of the windows game programming Gurus(Windows游戏大师之路) --- 前言(作者:ANDRE LAMOTHE 1999)...
  4. 【剑指offer】面试题12:矩阵中的路径(Java)
  5. hashSet与treeSet的去重原理
  6. 有没有检查c语言编译错误的软件,求大佬解答,为什么这个程序编译软件检查不出错误...
  7. 端口映射原理,公网,内网,NA
  8. Elasticsearch 安装的时候,Unsupported major.minor version 51.0问题的解决
  9. 二分搜索(Binary Search)
  10. unity3D-下载安装指南
  11. SECS/GSM 测试工具
  12. TPP是也只是一种挑战
  13. matlab gui设计入门与实战,matlab gui编程教程
  14. 在U-boot中添加以太网驱动-Nazgul
  15. Python|报错解决|os.symlink: FileExistsError
  16. 置业顾问、权证人员使用说明
  17. 泰凌微8258入门教程 基础篇④——sig_mesh_sdk架构介绍
  18. 雷达数据 障碍物判断_数据科学的进入障碍
  19. android 4g wifi热点,WIFI热点部署+
  20. AD模数转换DA数模转换

热门文章

  1. snap7与西门子PLC连接配置
  2. 商都区域内蒙古盐碱地治理 国稻种芯-封兴毅:水稻种植破题
  3. 工业摄像头临时简易支架
  4. 新浪博客文章批量采集:数据分析师揭示重要信息
  5. wordpress下载主题出现FTP窗口
  6. 【转载】这婚礼 太像样了
  7. P1893 山峰暸望
  8. 前端三大主流框架之一 React
  9. 2023微信小程序商城助力:为何越来越多门店选择线上运营渠道?
  10. 金蝶云星空和伯俊ERP接口打通对接实战