wprintf()
может об этом позаботиться сама, но мне нужен способ выполнять конвертацию в обе стороны.int main(int argc, wchar_t* argv[])
(пытался исправлять на wmain, но тогда ругается ld и сборка падает с ошибкой). Также в её коде поменял функции сравнения и добавил к литералам префикс L.input = (char*) malloc(wcslen(argv[1]) * 4 + 1);
wcstombs(input, argv[1], wcslen(argv[1]) * 4);
printf("The converted string is \"%s\"\n", input);
Соответственно, мне нужно конвертировать массив wchar_t в массив char перед шифрованием, а после дешифровки выполнять обратную конвертацию.
Я поменял сигнатуру функции main() на int main(int argc, wchar_t* argv[]) (пытался исправлять на wmain, но тогда ругается ld и сборка падает с ошибкой).
int main(void)
, int main(int argc, char *argv[])
или эквивалентным. Там же написано, что набор символов во время выполнения программы -- implementation defined, поэтому нет гарантии, что их можно обработать кросплатформенно.Для конвертации wchar_t* в char* я пробовал использовать функцию wcstombs, однако почему-то у меня она совершенно не работает (при попытке преобразовать строку, содержащую только латиницу, я получаю null).
wcstombs
не занимается выделением памяти, если ты "получаешь null" -- это происходит в каком-то другом месте. Ну и если ты это делаешь внутри main принимающего wchar_t* argv[]
, то твой код интерпретирует строку char
как строку wchar_t
, что добавляет хаоса. wcstombs не занимается выделением памяти,
Там же написано, что набор символов во время выполнения программы -- implementation defined, поэтому нет гарантии, что их можно обработать кросплатформенно.
Т.е. исходные данные в любом формате можно зашифровать, а потом расшифровать обратно. Поэтому имеет смысл отделить преобразование форматов входных данных от шифрования/расшифровки.
то твой код интерпретирует строку char как строку wchar_t, что добавляет хаоса
то твой код интерпретирует строку char как строку wchar_t, что добавляет хаоса
читал в одном источнике, что на Windows новых версий наоборот аргументы в cmd.exe передаются в Unicode
я реализовал чтение аргументов через функции WinAPI, заключив их в #ifdef. Насколько это индусский код, и что с ним будет на Linux?
в чём отличие преобразования (wchar_t*) в (char*) явным образом и вызова wcstombs?
после расшифровки строки с русскими буквами и её вывода на консоль получался мусор. Это так и должно быть, или где-то в моём коде есть баг, который к этому приводит?
Вопрос в том, что может я где-то усложнил себе жизнь?
int main(int argc, wchar_t* argv[])
{
for (int i = 1; i < argc; i++) {
printf("%s ", argv[i]);
}
return;
}
C:\Users\Alex\Documents\cpp\Lessons\alphacrypt>acp.exe "test"
test
C:\Users\Alex\Documents\cpp\Lessons\alphacrypt>acp.exe "Привет"
╧ЁштхЄ
C:\Users\Alex\Documents\cpp\Lessons\alphacrypt>acp.exe "δασκάλα"
.git LICENSE
да нет, дело не в шифровании:
int main(int argc, wchar_t* argv[]) ... printf("%s ", argv[i]);
%s
-- это не тот формат, который можно использовать для вывода строки wchar_t*
. Этот код частично работает потому что ты не работаешь с отдельными символами argv
, если бы ты стал это делать, ты бы сразу увидел, что что-то сильно не так. Попробуй в этой программе посимвольно напечатать аргументы. setlocale(LC_ALL, "")
? Второй здесь: зачем там wchar_t, учитывая, что на выходе будут только символы из набора с64? Насчёт второго - нет, на выходе после расшифровки нужны именно любые символы любых языков.
en_US.utf8
? en_US.utf8
с русским текстом на моей русской винде работает нормально... Не факт правда, что так будет у людей с другой системной локалью. по-моему она возникает как раз не в cmd, а в консоли VS Code.
setlocale(LC_ALL, "")
мог бы помочь именно здесь.Как ни странно, именно en_US.utf8 с русским текстом на моей русской винде работает нормально...
utf8
имеет значение, и, поскольку она обозначает кодировку, способную представить весь unicode, она будет работать для любых символов. Проблемы будут у людей использующих кодовые страницы типа сp1251
.