从UNICODE中截取一段字符串,很简单的大侠进来拿分

codelabs 2010-05-28 05:44:34
我有一个ucs2字符串(pEms->textBuffer),里面的内容是:“我爱你520,”现在我要截取“我爱你”和“,”中间的“520”,我下面的代码实在看不出哪里有问题,但是确实有问题.
问题是:在ascii的“520”(buf)前面多了几个没用的东西。
typedef char S8;

S8* password1; //该指针指向“我爱你”的后面
S8* password2; //该指针指向“,”的前面

//上面两个指针中间的就是“520”了。

S8 pass_word1[]={0x2c,0x67,0x21,0x6b,0xc6,0x5b,0x1,0x78,0x0,0x0};里面内容是“我爱你”
S8 pass_word2[]={0xc,0xff,0x0,0x0};里面内容是“,”

if(password1=UCS2Strstr( (const S8 *)pEms->textBuffer, (const S8 *)pass_word1) )//p1指向了“我爱你”的前面
{
S8 password3[64]={0}; //用于保存得到的UCS2类型的“520”
S8 buf[64]={0}; }; //用于保存得到的ascii类型的“520”
int len=0;
password2=UCS2Strstr((const S8 *)pEms->textBuffer,pass_word2); //此时p2指向了“,”的前面
len=UCS2Strlen(pass_word1); //计算“我爱你”的长度
password1+=len; //将P1指向“我爱你”的后面
UCS2Strncpy(password3,password1,password2-password1);//将P1,P2中间的“520”复制到了p3中。
password3[password2-password1]='\0';
mmi_ucs2_to_asc(buf,password3); //将P3转换为ACSII类型保存到Buf中。
......

}

大侠们指点下。用自由女神的名誉保证:谁在我自己解决之前解决的追加到一百分,附上大大的代码后看自己的分。
...全文
154 点赞 收藏 13
写回复
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
janewhee2001 2011-05-12
我今天也碰到了和楼主一样的问题,看来是同一个行业的,哈哈哈,今天搞了半天,最后总算有点眉目了,不知道楼主搞定了没有?

建议1:
pass_word1和pass_word2这2个数组最后面都是以0x0000结尾的,要把这个长度去掉才行,所以
len=UCS2Strlen(pass_word1)-1; //计算“我爱你”的长度
建议2:
password1+=len; 这条语句肯定有问题,应该是password1+=len*2;
正如楼上说的,指针移动的时候的单位是字节。而len是双字节的个数,肯定不能直接用了。
建议3:
在操作的时候可以直接用printf("%x",),把二进制数输出来,这样更加看的清楚指针操作的情况 。
回复
codelabs 2010-05-28

不好意思好像没UCS2类型的指针。

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


[Quote=引用 9 楼 www112y 的回复:]
分应该给我呀,兄弟!!!!
你好好看看我的说明。
具体你的库函数是什么开发工具我不清楚。

你这么写有可能对
((UCS2 ×)password1) +=len;
对比你原来的写法
password1+=len;


-----------------------------------------
加分到100了还没人进来啊,有这么难么
[/Quote]
回复
codelabs 2010-05-28
恩,我试一下,通过了立刻给你啊
回复
www112y 2010-05-28
分应该给我呀,兄弟!!!!
你好好看看我的说明。
具体你的库函数是什么开发工具我不清楚。

你这么写有可能对
((UCS2 ×)password1) +=len;//转化成指针不是乘号,网页太恶心了
对比你原来的写法
password1+=len;


-----------------------------------------
加分到100了还没人进来啊,有这么难么
回复
www112y 2010-05-28
分应该给我呀,兄弟!!!!
你好好看看我的说明。
具体你的库函数是什么开发工具我不清楚。

你这么写有可能对
((UCS2 ×)password1) +=len;
对比你原来的写法
password1+=len;


-----------------------------------------
加分到100了还没人进来啊,有这么难么
回复
www112y 2010-05-28
没留神,不好意思兄弟。应该是ucs2长度。不过话说回来,这两种编码基本差不多,google.

////////////////////////////
引用 3 楼 www112y 的回复:
兄弟,貌似这两句话有问题:
len=UCS2Strlen(pass_word1); //计算“我爱你”的长度 这个长度是utf-16长度
password1+=len; //将P1指向“我爱你”的后面 password1是char*指针移动的时候len需要是字节数目,现在utf-16长度肯定比字节数目少,所以移动错了


UCS2Strlen()这个函数是获取 ucs2类型数据的长度吧?
回复
codelabs 2010-05-28
加分到100了还没人进来啊,有这么难么
回复
codelabs 2010-05-28
[Quote=引用 3 楼 www112y 的回复:]
兄弟,貌似这两句话有问题:
len=UCS2Strlen(pass_word1); //计算“我爱你”的长度 这个长度是utf-16长度
password1+=len; //将P1指向“我爱你”的后面 password1是char*指针移动的时候len需要是字节数目,现在utf-16长度肯定比字节数目少,所以移动错了
[/Quote]

UCS2Strlen()这个函数是获取 ucs2类型数据的长度吧?
回复
www112y 2010-05-28
兄弟,貌似这两句话有问题:
len=UCS2Strlen(pass_word1); //计算“我爱你”的长度 这个长度是utf-16长度
password1+=len; //将P1指向“我爱你”的后面 password1是char*指针移动的时候len需要是字节数目,现在utf-16长度肯定比字节数目少,所以移动错了
回复
codelabs 2010-05-28
unicode类型的数据啊
回复
www112y 2010-05-28

兄弟,貌似这两句话有问题:
len=UCS2Strlen(pass_word1); //计算“我爱你”的长度 这个长度是utf-16长度
password1+=len; //将P1指向“我爱你”的后面 password1是char*指针移动的时候len需要是字节数目,现在utf-16长度肯定比字节数目少,所以移动错了
回复
pengzhixi 2010-05-28
不过我这个好像是GB2312的。
回复
pengzhixi 2010-05-28
char *s="我爱你520";
char s1[7];
strncpy(s1,s,6);
s1[6]='\0';
cout<<s1<<endl;
回复
发动态
发帖子
C语言
创建于2007-09-28

6.2w+

社区成员

C语言相关问题讨论
申请成为版主
社区公告
暂无公告