LINUX.ORG.RU

Поясните поведение mbstowcs


0

0

Если в main опустить вызов setlocale в любом из вариантов, то вызов mbstowcs возвращает -1 на первом кириллическом символе. Если же setlocale вызван, то все работает корректно.

wchar_t* convert_from_UCS2(char* mess, size_t len){
    iconv_t ids = iconv_open("utf-8", "UCS-2");
    if( ids ==(iconv_t) -1 )
        return 0;

    wchar_t* message = (wchar_t*) malloc(MESS_MAX_LEN*sizeof(wchar_t));
    
    char rs[MESS_MAX_LEN];
    size_t out = sizeof(rs);

    memset(rs, 0, out);

    char* rsp = rs;
 
    if( iconv(ids, &mess, &len, &rsp, &out ) == -1 ){
        free( message );
        iconv_close(ids);
        return 0;
    }

    iconv_close(ids);

    if ( mbstowcs(message, rs, MESS_MAX_LEN) == -1 ){
        free( message );
        return 0;
    }

    return message;    
}

int main(int argc, char** argv) {

    if (setlocale(LC_ALL, "") == 0) return -1;
    //if (setlocale(LC_ALL, "ru_RU.UTF-8") == 0) return -1;

    char* syms="\x61\xf1\x98\x5c\x36\x9f\xd1\0";
    char* syms_ucs="\x55\x00\x6e\x00\x69\x00\x63\x00\x6f\x00\x64\x00\x65\x00\x20\x00\x20\x00\x4d\x04\x42\x04\x3e\x04";
    //char* syms_ucs="\x1f\x04";
    wchar_t* result = convert_from_GSM(syms);
    
    assert(result != 0);

    wprintf(L"%ls\n", result);

    free (result);

    result = convert_from_UCS2(syms_ucs, 24);

    assert(result != 0);

    wprintf(L"%ls\n", result);

    free (result);   

    return (EXIT_SUCCESS);
}
★★★★★

Последнее исправление: Dark_SavanT (всего исправлений: 2)

The behavior of mbstowcs() depends on the LC_CTYPE category of the current locale.

А -1 возвращает, так как обнаружена неверная последовательность символов для текущей локали.

sjinks ★★★
()
Ответ на: комментарий от Dark_SavanT

>Наступил апрель и лыжи ехать категорически отказываются.

Спасибо за настроение:)

Pavval ★★★★★
()
Ответ на: комментарий от sjinks

Это мне man и так рассказал. Я догнать не могу, какая тогда локаль в приложении установлена по умолчанию и на какую ее меняет вызов setlocale(LC_ALL, "")

Dark_SavanT ★★★★★
() автор топика
Ответ на: комментарий от Dark_SavanT

> какая тогда локаль в приложении установлена по умолчанию

«C» так же известная как «POSIX»

на какую ее меняет вызов setlocale(LC_ALL, "")

на ту, которая установлена в соответствующих переменных окружения, например LANG (man setlocale)

Eshkin_kot ★★
()
Ответ на: комментарий от Eshkin_kot

В итоге бНОПНЯ - как работать с wide string без привязки к локали.

Задача пока простая - прочитать строку символов, перевести ее из ucs-2 кодировки в что-то более потребное и выдать, допустим, на stdout. Эта задача решена, но остается вопрос - а как быть на устройстве, на котором вообще нет выбора локалей(только С)?

Dark_SavanT ★★★★★
() автор топика
Ответ на: комментарий от Dark_SavanT

> а как быть на устройстве, на котором вообще нет выбора локалей

Пользоваться вещами, не зависящими от локали.

К.О.

LamerOk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.