LINUX.ORG.RU

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

Исправление 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;
}