mbsctows用于计算数组中的宽字符数

mbsctows用于计算数组中的宽字符数,c,C,我目前正在使用UNIX和COBOL,并且已经达到了一个要求,即我需要在接收到的消息中提供中文和韩文字符的数量,我计划使用mbstows在C程序中完成该操作 我使用的是下面的代码,它没有给出中文双字节字符的正确计数,而是给出了字节计数 #include <wchar.h> #include <stdio.h> #include <locale.h> int main(int argc, char *argv[] ) { if ( argc != 2 )

我目前正在使用UNIX和COBOL,并且已经达到了一个要求,即我需要在接收到的消息中提供中文和韩文字符的数量,我计划使用mbstows在C程序中完成该操作

我使用的是下面的代码,它没有给出中文双字节字符的正确计数,而是给出了字节计数

#include <wchar.h>
#include <stdio.h>
#include <locale.h>
int main(int argc, char *argv[] )
{
    if ( argc != 2 ) /* argc should be 2 for correct execution */
    {
        /* We print argv[0] assuming it is the program name */
        printf( "usage: %s filename", argv[0] );
    }
    int Size = getCharCount(argv[1]);
    printf ("THE CHAR COUNT  %d", Size);
    return Size;
}
int getCharCount(char *argv)
{
    wchar_t *wcsVal = NULL;     
    char *mbsVal = NULL;
    char* localeInfo;
    setlocale(LC_ALL, "zh_CN.GB18030");

    /* verify locale is set */      
    if (setlocale(LC_ALL, "") == 0)      
    {
        /*                      printf(stderr, "Failed to set locale\n"); */
        return 1;
    }
    mbsVal = argv;
    printf (" MBSVAL %s\n", mbsVal);
    /* validate multibyte string and convert to wide character */

    int size = mbstowcs(NULL, mbsVal, 0);
    if (size == -1)
    {         
        printf("Invalid multibyte\n");         
        return 1;
    }
    return size; 
}
#包括
#包括
#包括
int main(int argc,char*argv[])
{
如果(argc!=2)/*argc应为2以正确执行*/
{
/*我们打印argv[0],假设它是程序名*/
printf(“用法:%s文件名”,argv[0]);
}
int Size=getCharCount(argv[1]);
printf(“字符计数%d”,大小);
返回大小;
}
int getCharCount(char*argv)
{
wchar_t*wcsVal=NULL;
char*mbsVal=NULL;
char*localeInfo;
setlocale(LC_ALL,“zh_CN.GB18030”);
/*验证是否设置了区域设置*/
if(setlocale(LC_ALL,“”==0)
{
/*printf(stderr,“无法设置区域设置\n”)*/
返回1;
}
mbsVal=argv;
printf(“MBSVAL%s\n”,MBSVAL);
/*验证多字节字符串并转换为宽字符*/
int size=mbstowcs(NULL,mbsVal,0);
如果(大小==-1)
{         
printf(“无效的多字节\n”);
返回1;
}
返回大小;
}
感谢您的友好回应

问候

Akm

您的产品线:

if (setlocale(LC_ALL, "") == 0)

将区域设置重置为环境变量中设置的值,因此可能不再是中文字符集。尝试删除它或检查环境变量值。

将区域设置设置为程序员为处理特定字符集而选择的特定值是不正确的用法。不仅语言环境名称是特定于实现的;它们还用于反映用户或系统的字符编码


如果需要以编程方式处理特定的字符编码,则存在用于此目的的
iconv
接口。使用
iconv_-open(“WCHAR_-T”、“GB18030”)
获取一个转换描述符,并将一次两个kb转换为堆栈上的一次性缓冲区,将每次运行获得的输出字符数相加。

顺便说一句,我知道
iconv
是POSIX,而不是纯C,但是OP的问题是使用
setlocale
和一些参数,这些参数表明这段代码运行在类似Unix的系统上,可能是GNU/Linux。与
setlocale
的不可移植参数不同,如果您的系统没有
iconv
,则可以插入您自己的
iconv
库。您好,非常感谢您的回复。我试着对提到的代码进行注释,但代码仍然不起作用。我试图给这个程序的输入是:½»ÍÍÍÍÍÍ:ÍÍÍÍÍÍÍÍÍÍÍÍÍ,这是一个双字节汉字的字节流。它实际上有20个字节,但我的C程序应该识别它们是中文字符,并提供10的计数,因为它们是双字节字符。任何回复都将非常感谢。。。提前感谢…您确定您设置的区域设置已安装在您的系统上吗?如果在shell中执行LC_ALL或LC_CTYPE集,操作系统是否接受它?您好,我编写了该程序并能够成功运行。。。唯一的问题是,它没有在双字节字符的输入字节流中识别汉字集。。。。。我尝试使用下面的-if(setlocale(LC_ALL,“zh_CN.GB18030”)==0{printf(“设置区域设置失败”);return 1;}您可能需要添加一些包来支持此区域设置。试着运行locale-a来列出系统上已安装的区域设置。你好,Benoit,非常感谢。。。。你的建议真的奏效了。。。我尝试了locale-a来获取可用的locale,发现zh_CN.GB18030中的字符z是大写的。。。GB18030…现在该程序能够提供正确的字符计数。。。再次感谢你的建议。。。