UTF-8 и C++, полноценная работа с различными языками в консольной программе

я новичок в с++ и у меня проблема с обработкой строк в unicode (далее в коде будут греческие и русские символы). Требуется считать данные с клавиатуры, записать в переменную и вывести в файл в utf-8, после считать. В гугле подробностей не нашел.

Параметры проекта:

  • IDE = VS2019
  • Набор под платформу vs2015 v140
  • Проект = консольное приложение
  • в свойствах проекта = использовать Юникод
  • в свойствах консоли = текст: Lucida Console, кодировка: 65001(UTF-8)

Прикладываю отдельные части кода:

1) код обработки ввода с клавиатуры (повторяется для имени и фамилии) при дебаге в переменных 'str' 'strU' появляются кракозябры типо 0x00f436f0 L"Андрей\r\nôﺀó"

HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE in = GetStdHandle(STD_INPUT_HANDLE);
const size_t MAX_NUMBERS_OF_CHARS = 128;
wchar_t* str = (wchar_t*)calloc(MAX_NUMBERS_OF_CHARS, sizeof(wchar_t)); //для введенных символов
unsigned long entered_numbers_of_chars;

static std::wstring resourceString = L"\nEnter your name >>\n";
WriteConsoleW(out, resourceString.c_str(), resourceString.size(), NULL, NULL);
if (ReadConsoleW(in, str, MAX_NUMBERS_OF_CHARS, &entered_numbers_of_chars, NULL) == 0) {
    std::wcout << "ERROR: %ld", GetLastError();
}

// здесь удаляю '\r\n' из ввода
realloc(str, (entered_numbers_of_chars*sizeof(wchar_t))+1);    // ужимаю str в размер ввода из 128б
size_t strLen = wcslen(str);   // длина строки ввода = 'entered_numbers_of_chars'
size_t strLenU = strLen-2;     // длина строки без '\r\n'
wchar_t* strU = (wchar_t*)calloc(strLenU+1, sizeof(wchar_t));       //выделяю место под новую строку
wcsncpy(strU, str, strLenU);    // копирую введенную строку в новую без '\r\n'
wdata.name = strU;        // добавляю в структуру где хранятся данные (код структуры ниже)

//очищаю переменные перед следующим вводом -> фамилия
memset(str, 0, (entered_numbers_of_chars*sizeof(wchar_t)) + 1);
memset(strU, 0, (strLenU*sizeof(wchar_t)) + 1);

static std::wstring loginString = L"\nEnter your surname >>\n";
WriteConsoleW(out, loginString.c_str(), loginString.size(), NULL, NULL);
if (ReadConsoleW(in, str, MAX_NUMBERS_OF_CHARS, &entered_numbers_of_chars, NULL) == 0) {
    std::wcout << "ERROR: %ld", GetLastError();
}
realloc(str, (entered_numbers_of_chars*sizeof(wchar_t)) + 1);
strLen = wcslen(str);
strLenU = strLen - 2;
realloc(strU, (strLenU*sizeof(wchar_t)) + 1);
wcsncpy(strU, str, strLenU);
wdata.surname = strU;
            
memset(str, 0, (entered_numbers_of_chars*sizeof(wchar_t)) + 1);
memset(strU, 0, (strLenU*sizeof(wchar_t)) + 1);

Так же, при попытке очистить переменные str и strU через free() получаю ошибку

2) код записи, отваливается на 3 строке '<<', с правильным кодом записи и чтении из файла затрудняюсь, подскажите

 std::wofstream io_file;                  //создаем поток 
 io_file.open(dirPath, std::ios::app);  // открываем файл для записи в конец
 io_file << wdata.stResource << strSep << wdata.stLogin << strSep << wdata.stCyphPassword << strSep << strSep; 

3) код структуры wdata

struct Credentials
{
    std::wstring name;
    std::wstring surname;
};

Ответы (0 шт):