mbsctows для подсчета количества широких символов в массиве - PullRequest
2 голосов
/ 24 января 2011

В настоящее время я работаю над UNIX и COBOL и выполнил требование, в котором мне нужно указать количество китайских и корейских символов в полученном сообщении, которое я планирую выполнить в программе на языке C, используя mbstows.

IЯ использую приведенный ниже код, который не дает правильный счет для китайских двухбайтовых символов, но дает количество байтов.

#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 ]

3 голосов
/ 24 января 2011

Установка локали на конкретное значение, выбранное программистом для обработки определенного набора символов, является неправильным использованием. Мало того, что имена локалей зависят от реализации; они также предназначены для отражения кодировки символов пользователя или системы.

Если вам нужно программно обработать определенную кодировку символов, для этой цели существует интерфейс iconv. Используйте iconv_open("WCHAR_T", "GB18030");, чтобы получить дескриптор преобразования, и конвертировать пару килобайт за раз в одноразовый буфер в стеке, суммируя количество выходных символов, полученных при каждом запуске.

1 голос
/ 24 января 2011

Ваша линия:

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

сбросит LOCALE к значениям, установленным в переменных окружения, поэтому, возможно, больше не будет китайского набора символов. Попробуйте удалить его или проверьте значения переменных среды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...