Проблема вывода RU строк на Linux С++
Проблема заключается в неправильности вывода строк на Linux. Программу писал на Windows с кодировкой 1251, при запуске этого же кода на Linux появляется совершенно другой вывод, хотя я использую исходный алфавит. Повторюсь ещё раз, программа на Windows работает исправно и всё так, как следует. У меня сейчас 4 программы шифрования, которые исправно работают на Windows и я не могу понять как мне их подправить для корректной работы на Linux. Оставляю код одной из программ и прошу знающих людей объянсить как мне перенести код с Windows на Linux, хотя бы на примере данного кода и по возможности хочу узнать почему и как это работает, чтобы запустить ещё 3 программы на Linux. Так же оставлю ниже вместе с кодом скрин вывода данной программы. Используется шифрование методом Цезаря сдвигом на 1 символ. PS: Слово "привет" вводится корректно, я проверял. Точно такой же код работает безупречно на Windows. Повторяюсь во избежании быть неправильно понятым. Спасибо :)
#include <iostream>
#include <vector>
using namespace std;
string encrypt(string input)
{
vector<char> word(input.begin(), input.end());
string alphabet = "aбвгдеёжзийклмнопрстуфхцчшщъыьэюя.,:;-!?1234567890";
for (int i = 0; i < (int)input.length(); i++)
{
for (int j = 0; j < (int)alphabet.length(); j++)
{
if (word[i] == alphabet[j])
{
word[i] = alphabet[(j + 2)];
break;
}
}
}
string str(word.begin(), word.end());
return str;
}
string decrypt(string input)
{
vector<char> word(input.begin(), input.end());
string alphabet = "aбвгдеёжзийклмнопрстуфхцчшщъыьэюя.,:;-!?1234567890";
for (int i = 0; i < (int)input.length(); i++)
{
for (int j = 0; j < (int)alphabet.length(); j++)
{
if (word[i] == alphabet[j])
{
word[i] = alphabet[(j - 2)];
break;
}
}
}
string str(word.begin(), word.end());
return str;
}
int main()
{
setlocale(LC_ALL, "ru_RU.UTF-8");
string text;
cout << "Введите данные для шифрования: " << endl;
cin >> text;
string textencrypt = encrypt(text);
cout << "Зашифрованные данные: " << textencrypt << endl << "\n";
cout << "Нажмите Enter для расшифроки данных: " << endl;
getchar();
string textdecrypt = decrypt(textencrypt);
cout << "Расшифрованные данные: " << textdecrypt << endl << "\n";
cout << "Нажмите Enter для закрытия программы: " << endl;
getchar();
return 0;
}
Ответы (1 шт):
Вот несколько шагов, ИМХО, которые могут помочь решить эту проблему:
- Указать в компиляторе, например:
g++ -o your_program your_program.cpp -std=c++11 -finput-charset=UTF-8 -fexec-charset=UTF-8. - Установить локаль с помощью команды:
export LC_ALL=en_US.UTF-8. - Используйте библиотеку locale:
#include <locale>
std::locale::global(std::locale("en_US.UTF-8"));
std::wcout.imbue(std::locale());
Этот код устанавливает глобальную локаль с кодировкой UTF-8 и связывает стандартный вывод с этой локалью.
- Используйте
wstringвместо обычных строкstring.
