Проблема вывода 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 шт):

Автор решения: Slavick Werewolf

Вот несколько шагов, ИМХО, которые могут помочь решить эту проблему:

  1. Указать в компиляторе, например: g++ -o your_program your_program.cpp -std=c++11 -finput-charset=UTF-8 -fexec-charset=UTF-8.
  2. Установить локаль с помощью команды:export LC_ALL=en_US.UTF-8.
  3. Используйте библиотеку locale:

#include <locale>

std::locale::global(std::locale("en_US.UTF-8"));

std::wcout.imbue(std::locale());

Этот код устанавливает глобальную локаль с кодировкой UTF-8 и связывает стандартный вывод с этой локалью.

  1. Используйте wstring вместо обычных строк string.
→ Ссылка