я новичок в с++ и у меня проблема с обработкой строк в 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_charssizeof(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_charssizeof(wchar_t)) + 1);
memset(strU, 0, (strLenUsizeof(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_charssizeof(wchar_t)) + 1);
strLen = wcslen(str);
strLenU = strLen - 2;
realloc(strU, (strLenUsizeof(wchar_t)) + 1);
wcsncpy(strU, str, strLenU);
wdata.surname = strU;
memset(str, 0, (entered_numbers_of_charssizeof(wchar_t)) + 1);
memset(strU, 0, (strLenUsizeof(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;
};
wchar_tи большинство функций WinAPI работают в кодировке UTF-16, да? Кроме того, не стоит мешать вывод в консоль посредством WinAPI (WriteConsoleW) и средствами С++ (cout). – user7860670 Aug 27 '22 at 19:38cin >> name;,f << name;.f- типаofstream. Utf-8 специально разработан так чтобы программы для работы с байтовыми потоками его нормально через себя пропускали. Удаление символов\n,\rтакже будет обработано правильно. – Stanislav Volodarskiy Aug 28 '22 at 07:22