mbsctows计算数组中宽字符的数量

时间:2011-01-24 11:21:20

标签: c

我目前正在开发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; 
}

感谢您的回应...

问候

AKM

2 个答案:

答案 0 :(得分:3)

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

如果需要以编程方式处理特定字符编码,则iconv接口存在此目的。使用iconv_open("WCHAR_T", "GB18030");获取转换描述符,并将一对kb一次转换为堆栈中的一次性缓冲区,总结从每次运行中获得的输出字符数。

答案 1 :(得分:1)

你的专栏:

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

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