История изменений
Исправление MOPKOBKA, (текущая версия) :
Прикладываю пример который должен работать везде, и использует две рабочие функции конвертации:
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
#include <stdlib.h>
#include <string.h>
#ifdef _WIN32
#include <windows.h>
#endif
// Шаг 2, правильная конвертация
#ifdef _WIN32
wchar_t* cstr2wstr(const char* s)
{
size_t s_len, ws_len;
wchar_t *ws;
s_len = strlen(s);
ws_len = MultiByteToWideChar(CP_UTF8, 0, s, s_len, NULL, 0);
if ((ws = malloc(ws_len + 1)) == NULL) {
wprintf(L"cstr2wstr: low memory\n");
exit(1);
}
MultiByteToWideChar(CP_UTF8, 0, s, s_len, ws, ws_len);
ws[ws_len] = 0;
return ws;
}
#else
wchar_t* cstr2wstr(const char* cstr)
{
size_t out_sz = mbstowcs(NULL, cstr, 0);
wchar_t* ws = malloc((out_sz + 1) * sizeof(wchar_t));
mbstowcs(ws, cstr, out_sz);
ws[out_sz] = 0;
return ws;
}
#endif
void right_pad(const char *text, int pad_size)
{
wchar_t *wtext = cstr2wstr(text);
// Шаг 3, правильный вывод
wprintf(L"%*ls |\n", pad_size, wtext);
free(wtext);
}
int main()
{
setlocale(LC_ALL, ""); // Шаг 1 правильная установка локали
right_pad("Привет мир!", 30);
right_pad("Hello World!", 30);
right_pad("Довольно длинная строка ...", 30);
return 0;
}
Исправление MOPKOBKA, :
Прикладываю пример который должен работать везде, и использует две рабочие функции конвертации:
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
#include <stdlib.h>
#include <string.h>
#ifdef _WIN32
#include <windows.h>
#endif
// Шаг 2, правильная конвертация
#ifdef _WIN32
wchar_t* cstr2wstr(const char* s)
{
size_t s_len, ws_len;
wchar_t *ws;
s_len = strlen(s);
ws_len = MultiByteToWideChar(CP_UTF8, 0, s, s_len, NULL, 0);
if ((ws = malloc(ws_len + 1)) == NULL) {
wprintf(L"cstr2wstr: low memory\n");
exit(1);
}
MultiByteToWideChar(CP_UTF8, 0, s, s_len, ws, ws_len);
ws[ws_len] = 0;
return ws;
}
#else
wchar_t* cstr2wstr(const char* cstr)
{
mbstate_t state;
memset(&state, 0, sizeof(state) );
size_t out_sz = mbstowcs(NULL, cstr, 0);
wchar_t* ws = malloc((out_sz + 1) * sizeof(wchar_t));
mbstowcs(ws, cstr, out_sz);
ws[out_sz] = 0;
return ws;
}
#endif
void right_pad(const char *text, int pad_size)
{
wchar_t *wtext = cstr2wstr(text);
// Шаг 3, правильный вывод
wprintf(L"%*ls |\n", pad_size, wtext);
free(wtext);
}
int main()
{
setlocale(LC_ALL, ""); // Шаг 1 правильная установка локали
right_pad("Привет мир!", 30);
right_pad("Hello World!", 30);
right_pad("Довольно длинная строка ...", 30);
return 0;
}
Исходная версия MOPKOBKA, :
Прикладываю пример который должен работать везде, и использует две рабочие функции конвертации:
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
#include <stdlib.h>
#include <string.h>
#ifdef _WIN32
#include <windows.h>
#endif
// Шаг 2, правильная конвертация
#ifdef _WIN32
wchar_t* cstr2wstr(const char* s)
{
size_t s_len, ws_len;
wchar_t *ws;
s_len = strlen(s);
ws_len = MultiByteToWideChar(CP_UTF8, 0, s, s_len, NULL, 0);
if ((ws = malloc(ws_len + 1)) == NULL) {
wprintf(L"cstr2wstr: low memory\n");
exit(1);
}
MultiByteToWideChar(CP_UTF8, 0, s, s_len, ws, ws_len);
ws[ws_len] = 0;
return ws;
}
#else
wchar_t* cstr2wstr(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);
return ws;
}
#endif
void right_pad(const char *text, int pad_size)
{
wchar_t *wtext = cstr2wstr(text);
// Шаг 3, правильный вывод
wprintf(L"%*ls |\n", pad_size, wtext);
free(wtext);
}
int main()
{
setlocale(LC_ALL, ""); // Шаг 1 правильная установка локали
right_pad("Привет мир!", 30);
right_pad("Hello World!", 30);
right_pad("Довольно длинная строка ...", 30);
return 0;
}