История изменений
Исправление 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) (взаимоисключ.)
Не понимаю о какой ошибке вы имеете в виду
В твоем самом первом примере, у тебя неправильно идет конвертация, а потом неправильно идет вывод.