C字符串中的汉字截取

erocyli 2009-06-08 04:11:10

C语言中如何实现以下功能:

字符串:"我A我家"

我要取出前4个字符,直接取的话会变成:"我A?"

有什么方法取前四个字符时,放弃乱码,显示"我A"即可。


先谢谢各位!

...全文
961 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
bclife 2009-06-10
  • 打赏
  • 举报
回复
原理上面的上面几楼都说了
如果还是不理解可以看一下关于UNICODE的介绍
实例代码(在C++中运行成功了,C没试):

#include <stdio.h>
#include <malloc.h>
#include <windows.h>
#include <locale.h>

//---------------------------------------------------------------------------
// 函数说明 : 按照UNICODE方式截取字符串指定位置左面的字符串
// 输入参数 : char* szAscii 被截取指定的字符串
// 输入参数 : int nPos 截取的位置
// 输入参数 : char* szSave 截取后保存到得字符串
// 返 回 值 : BOOL 是否成功截取
// 作者信息 : 自由人生 2009-6-10 9:30:55
//---------------------------------------------------------------------------
BOOL StrLeftW(char* szAscii, int nPos, char* szSave)
{
int nLenght;
wchar_t* szWText;

// 保存截取后的字符串是否有足够的空间
if (nPos > (int)strlen(szSave))
return FALSE;

// 为宽字符串创建内存空间
nLenght = strlen(szAscii)+1;
szWText = (wchar_t*)malloc(nLenght*sizeof(wchar_t));
if (szWText == NULL)
return FALSE;

// 将被截取的字符串转换为宽字符集
MultiByteToWideChar(CP_ACP, 0, szAscii, -1, szWText, nLenght);
szWText[nPos] = L'\0';

// 将截取后的宽字符集转换保存到指定的多字符集字符串中
nLenght = WideCharToMultiByte(CP_ACP, 0, szWText, -1, szSave, nPos*sizeof(wchar_t), NULL, FALSE);
szSave[nLenght] ='\0';

// 释放空间
free(szWText);
szWText = NULL;

return TRUE;
}

int main()
{
char* szAsc = "我A我家";
char szGetLeft[5];

setlocale(LC_CTYPE, "");

if (StrLeftW(szAsc, 3, szGetLeft))
printf("%s\n", szGetLeft);
else
printf("error!\n");

return 0;
}
阿迷创客 2009-06-10
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 donle1000 的回复:]
使用本地域名解析,用whcar_t变量存放字符串


C/C++ code
#include <stdio.h>
#include <locale.h>

int main()
{
wchar_t s[5] = L"我A我家";
setlocale(LC_CTYPE, "");
putwchar(s[0]);
putwchar(s[1]);
putchar("\n"); /*刚发了个帖子问汉字处理,这里找到了,顺便有个小错 putchar( '\n'); */
return 0;
}
[/Quote]
陽洸膂珵 2009-06-09
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
main()
{
char *ch="我A我家";
char a[4];

strncpy(a,ch,3);
p[3]='\0';

printf("%s\n",a);
}
hyyuanqiang 2009-06-09
  • 打赏
  • 举报
回复
以前做过
判断字节的是否大于 0x80?
大概就是这个意思
zzhangtuo 2009-06-08
  • 打赏
  • 举报
回复
楼主无聊得很
mjx1981 2009-06-08
  • 打赏
  • 举报
回复
楼主研究下IsDBCSLeadByteEx,也许可以帮到你
  • 打赏
  • 举报
回复
楼主可以从头讲讲你的情况跟需求,感觉你现在有点钻死胡同。
donle1000 2009-06-08
  • 打赏
  • 举报
回复
使用本地域名解析,用whcar_t变量存放字符串


#include <stdio.h>
#include <locale.h>

int main()
{
wchar_t s[5] = L"我A我家";
setlocale(LC_CTYPE, "");
putwchar(s[0]);
putwchar(s[1]);
putchar("\n");
return 0;
}
ltc_mouse 2009-06-08
  • 打赏
  • 举报
回复
这样可以吗? 这段代码假设src是ANSI编码的字符串~

int main()
{
const char *src="我A我家";
char dst[5];
int i=0;
memcpy(dst, src, 4);
dst[4]='\0';
for(i=0; i<4; )
{
if( dst[i]<0 ) /* 汉字,两个字节 */
i += 2;
else /* ASCII码字符 */
i ++;
}
if(i==5) /* 最后一个字节是半个汉字,截断 */
dst[3] = '\0';

printf("%s\n", dst);
return 0;
}
erocyli 2009-06-08
  • 打赏
  • 举报
回复
如果是Delphi的话,判断一个最后一个字符串的类型是什么(mbSingleByte, mbLeadByte, mbTrailByte)
如果是mbLeadByte就扔掉它。。。
czfnaruto 2009-06-08
  • 打赏
  • 举报
回复
假如一个汉字的两个字符中不是由 a-z 或者 A-Z 或者 '0'-'9'

那你只要在最后两个字节中判断一下
(ch>='a' && ch<='z') || (ch>='A' && ch<='Z') || (ch>='0' && ch<='9')

然后根据情况是把第4个还是在第5个字节变为'\0'以表示结束就好了

汉字的字符组成我不是很清楚是否包含了这些字符
erocyli 2009-06-08
  • 打赏
  • 举报
回复

我是不希望看到那个乱码!

如果取到是的"我A?"

我只要显示"我A"就行了。
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 supermegaboy 的回复:]
我看大家都没有理解楼主的意思,我来替他说说吧。

楼主的意思其实是如何分辨一个混合了ASCII码和UNICODE码的字符串,需要智能地对不同编码的内容进行分割。

看谁知道如何处理这个问题,打个桩先。
[/Quote]

很牛逼,一个无界的问题,如果这个想法可以实现,那估计也不需要什么编码转换了。
erocyli 2009-06-08
  • 打赏
  • 举报
回复
你这样是知道了字符串,然后把它的某位填'\0',那如果是个未知的字符串呢?
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 erocyli 的回复:]

我要截取4个字符呀,

我要是想把这个功能用函数实现,应该怎么做呢?
[/Quote]

你已经截取4字符了啊,
直接取的话会变成:"我A?"

出现乱码说明你截取成功了啊,你还要怎样?
飞天御剑流 2009-06-08
  • 打赏
  • 举报
回复
我看大家都没有理解楼主的意思,我来替他说说吧。

楼主的意思其实是如何分辨一个混合了ASCII码和UNICODE码的字符串,需要智能地对不同编码的内容进行分割。

看谁知道如何处理这个问题,打个桩先。
erocyli 2009-06-08
  • 打赏
  • 举报
回复

我知道不能识别,所以才来问有什么好的方法,

就是对一个字符串(char),想取前4位,如果最后一位是不是一个汉字或一个字母,就丢掉它。。。
czfnaruto 2009-06-08
  • 打赏
  • 举报
回复
文字是两个字符 字母和数字是一个字符

char *ch="我爱我家";
char p[5];
int i;

for(i=0;i<4;i++) p[i]=*(ch+i);
p[4]='\0';


printf("%s\n",p);

你是要这样的结果吗
ltc_mouse 2009-06-08
  • 打赏
  • 举报
回复
建议google汉字编码学习下~

汉字的GBK码占两个字节,第一个字节>0x80。根据这个先判断出是汉字还是字母,进一步判断最后一个字符要不要舍弃...
加载更多回复(10)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧