LINUX.ORG.RU

История изменений

Исправление Gyros, (текущая версия) :

Гениальный код! Спасибо! Беру.

Но его должен был написать я.

Вы из готовых наработок взяли? Или так быстро написали.

Я топтался на месте, потому что у меня была строка

const char ALPHABET[]="АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдежзиклмнопрстуфхцчшщььыъэюя";

а надо было как массив представлять.

Плюс еще не знал как по массиву бежать, ведь в нем одно- и двух- символы вперемешку. Мне все время казалось, что надо читать текущий + следующий..

Функции mbstowcs, mbsrtowcs работают, но криво, как будто добавляют что-то лишнее (например, символ переноса на нов. строку) + не дают выравнивание. И в Linux, и в Windows они не выравнивают и выводятся только с пом printf, а не wprintf.

Вот так выводит по русски

const char FMT[] = "%30ls|\n";
printf(FMT, str);

Но отказаться от них полностью тоже нельзя.

В Windows сконвертир. функциями mbstowcs или mbsrtowcs рус. строки выводятся, но printf-ом с «%ls». Так что они работают под Windows.

До WinAPI-шной ф-ции еще не дошел, я с этими воевал.

Ф-ция

wchar_t* convert_to_wstr(const char* cstr)
{
    mbstate_t state;
    memset(&state, 0, sizeof(state) );
    size_t out_sz = 1 + mbsrtowcs(NULL, &cstr, 0, &state);
    
    wchar_t* ws = malloc(out_sz*sizeof(wchar_t) );
    mbstowcs(ws, cstr, out_sz);              //(1)
    //mbsrtowcs(ws, &cstr, out_sz, &state);  //(2)
    return ws;
}

работает. Хоть с раскомментир. строкой (1) или (2) (взаимоисключ.)

Не понимаю о какой ошибке вы имеете в виду

В твоем самом первом примере, у тебя неправильно идет конвертация, а потом неправильно идет вывод.

Исправление Gyros, :

Гениальный код! Спасибо! Беру.

Но его должен был написать я.

Вы из готовых наработок взяли? Или так быстро написали.

Я топтался на месте, потому что у меня была строка

const char ALPHABET[]="АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдежзиклмнопрстуфхцчшщььыъэюя";

а надо было как массив представлять.

Плюс еще не знал как по массиву бежать, ведь в нем одно- и двух- символы вперемешку. Мне все время казалось, что надо читать текущий + следующий..

Функции mbstowcs, mbsrtowcs работают, но криво, как будто добавляют что-то лишнее (например, символ переноса на нов. строку) + не дают выравнивание. И в Linux, и в Windows они не выравнивают и выводятся только с пом printf, а не wprintf.

Вот так выводит по русски

const char FMT[] = "%30ls|\n";
printf(FMT, str);

Но отказаться от них полностью тоже нельзя.

В Windows выводит русские буквы, но printf-ом с «%ls».

До WinAPI-шной ф-ции еще не дошел, я с этими воевал.

Ф-ция

wchar_t* convert_to_wstr(const char* cstr)
{
    mbstate_t state;
    memset(&state, 0, sizeof(state) );
    size_t out_sz = 1 + mbsrtowcs(NULL, &cstr, 0, &state);
    
    wchar_t* ws = malloc(out_sz*sizeof(wchar_t) );
    mbstowcs(ws, cstr, out_sz);              //(1)
    //mbsrtowcs(ws, &cstr, out_sz, &state);  //(2)
    return ws;
}

работает. Хоть с раскомментир. строкой (1) или (2) (взаимоисключ.)

Не понимаю о какой ошибке вы имеете в виду

В твоем самом первом примере, у тебя неправильно идет конвертация, а потом неправильно идет вывод.

Исправление Gyros, :

Гениальный код! Спасибо! Беру.

Но его должен был написать я.

Вы из готовых наработок взяли? Или так быстро написали.

Я топтался на месте, потому что у меня была строка

const char ALPHABET[]="АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдежзиклмнопрстуфхцчшщььыъэюя";

а надо было как массив представлять.

Плюс еще не знал как по массиву бежать, ведь в нем одно- и двух- символы вперемешку. Мне все время казалось, что надо читать текущий + следующий..

Функции mbstowcs, mbsrtowcs работают, но криво, как буд-то добавляют что-то лишнее (например, символ переноса на нов. строку) + не дают выравнивание. И в Linux, и в Windows они не выравнивают и выводятся только с пом printf, а не wprintf.

Вот так выводит по русски

const char FMT[] = "%30ls|\n";
printf(FMT, str);

Но отказаться от них полностью тоже нельзя.

В Windows выводит русские буквы, но printf-ом с «%ls».

До WinAPI-шной ф-ции еще не дошел, я с этими воевал.

Ф-ция

wchar_t* convert_to_wstr(const char* cstr)
{
    mbstate_t state;
    memset(&state, 0, sizeof(state) );
    size_t out_sz = 1 + mbsrtowcs(NULL, &cstr, 0, &state);
    
    wchar_t* ws = malloc(out_sz*sizeof(wchar_t) );
    mbstowcs(ws, cstr, out_sz);              //(1)
    //mbsrtowcs(ws, &cstr, out_sz, &state);  //(2)
    return ws;
}

работает. Хоть с раскомментир. строкой (1) или (2) (взаимоисключ.)

Не понимаю о какой ошибке вы имеете в виду

В твоем самом первом примере, у тебя неправильно идет конвертация, а потом неправильно идет вывод.

Исправление Gyros, :

Гениальный код! Спасибо! Беру.

Но его должен был написать я.

Вы из готовых наработок взяли? Или так быстро написали.

Я топтался на месте, потому что у меня была строка

const char ALPHABET[]="АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдежзиклмнопрстуфхцчшщььыъэюя";

а надо было как массив представлять.

Плюс еще не знал как по массиву бежать, ведь в нем одно- и двух- символы вперемешку. Мне все время казалось, что надо читать текущий + следующий..

Функции mbstowcs, mbsrtowcs работают, но криво, добавляют что-то лишнее (перенос на нов. строку) + не дают выравнивание. И в Linux, и в Windows они не выравнивают и выводятся только с пом printf, а не wprintf.

Вот так выводит по русски

const char FMT[] = "%30ls|\n";
printf(FMT, str);

Но отказаться от них полностью тоже нельзя.

В Windows выводит русские буквы, но printf-ом с «%ls».

До WinAPI-шной ф-ции еще не дошел, я с этими воевал.

Ф-ция

wchar_t* convert_to_wstr(const char* cstr)
{
    mbstate_t state;
    memset(&state, 0, sizeof(state) );
    size_t out_sz = 1 + mbsrtowcs(NULL, &cstr, 0, &state);
    
    wchar_t* ws = malloc(out_sz*sizeof(wchar_t) );
    mbstowcs(ws, cstr, out_sz);              //(1)
    //mbsrtowcs(ws, &cstr, out_sz, &state);  //(2)
    return ws;
}

работает. Хоть с раскомментир. строкой (1) или (2) (взаимоисключ.)

Не понимаю о какой ошибке вы имеете в виду

В твоем самом первом примере, у тебя неправильно идет конвертация, а потом неправильно идет вывод.

Исходная версия Gyros, :

Гениальный код! Спасибо! Беру.

Но его должен был написать я.

Вы из готовых наработок взяли? Или так быстро написали.

Я топтался на месте, потому что у меня была строка

const char ALPHABET[]="АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдежзиклмнопрстуфхцчшщььыъэюя";

а надо было как массив представлять.

Плюс еще не знал как по массиву бежать, ведь в нем одно- и двух- символы вперемешку. Мне все время казалось, что надо читать текущий + следующий..

Функции mbstowcs, mbsrtowcs работают, но криво, добавляют что-то лишнее (перенос на нов. строку) + не дают выравнивание. И в Linux, и в Windows они не выравнивают и выводятся только с пом printf, а не wprintf

const char FMT[] = "%30ls|\n";
printf(FMT, str);

Но отказаться от них полностью тоже нельзя.

В Windows выводит русские буквы, но printf-ом с «%ls».

До WinAPI-шной ф-ции еще не дошел, я с этими воевал.

Ф-ция

wchar_t* convert_to_wstr(const char* cstr)
{
    mbstate_t state;
    memset(&state, 0, sizeof(state) );
    size_t out_sz = 1 + mbsrtowcs(NULL, &cstr, 0, &state);
    
    wchar_t* ws = malloc(out_sz*sizeof(wchar_t) );
    mbstowcs(ws, cstr, out_sz);              //(1)
    //mbsrtowcs(ws, &cstr, out_sz, &state);  //(2)
    return ws;
}

работает. Хоть с раскомментир. строкой (1) или (2) (взаимоисключ.)

Не понимаю о какой ошибке вы имеете в виду

В твоем самом первом примере, у тебя неправильно идет конвертация, а потом неправильно идет вывод.