Проблема турецкой строки С++ с setlocale

Я хочу найти турецкие символы из ввода пользователя. Вот мой код:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    setlocale(LC_ALL, "Turkish");
    string input;
    string chars = "çığöşü";
    cout << "Input: ";
    getline(cin, input);
    cout << "Turkish Characters: " << chars << "\n";
    cout << "Your input: " << input;
    return 0;
}

Когда я запускаю его, я получаю следующее:

Input: çığöşü
Turkish Characters: çığöşü
Your input: ┼?§"Y?

Если я не использую setlocale, я получаю это:

Input: çığöşü
Turkish Characters: ²­÷■³
Your input: çığöşü

Я использовал wstring, но это ничего не изменило. Я хочу получить текст от пользователя и попытаться найти турецкие символы в тексте, используя мою строку символов. Есть простой способ сделать это? (Я использую Windows)


person M. G.    schedule 03.11.2018    source источник


Ответы (2)


Если ваш системный язык не турецкий, то "çığöşü" скомпилирован как английский или какие бы настройки у вас ни были, он будет соответствовать другому набору символов на турецком языке. Если в настройках вашего компилятора вы не измените кодовую страницу для файла *.cpp на турецкую. В противном случае вам придется использовать L"çığöşü" и преобразовать его в правильную кодовую страницу ANSI.

Используйте SetConsoleCP/SetConsoleOutputCP с кодовой страницей 1254 для печати на турецком языке. Пример:

#include <iostream>
#include <string>
#include <windows.h>

std::string ansi(wchar_t* wbuf, int codepage)
{
    int len = WideCharToMultiByte(codepage, 0, wbuf, -1, 0, 0, 0, 0);
    std::string shortname;
    shortname.resize(len, L'\0');
    WideCharToMultiByte(codepage, 0, wbuf, -1, &shortname[0], len, 0, 0);
    shortname.resize(len - 1);
    return shortname;
}

int main()
{
    int codepage = 1254;
    SetConsoleOutputCP(codepage);
    SetConsoleCP(codepage);
    std::cout << ansi(L"çığöşü\n", codepage);
    std::string input;
    std::cout << "Input: ";
    std::getline(std::cin, input);
    std::cout << input << "\n";
    return 0;
}

Рекомендуется использовать Unicode (не использует _setmode, специфичный для Visual Studio)

#include <iostream>
#include <string>
#include <io.h> 
#include <fcntl.h> 

int main()
{
    _setmode(_fileno(stdout), _O_U16TEXT);
    _setmode(_fileno(stdin), _O_U16TEXT);
    std::wcout << L"çığöşü\n";
    std::wstring input;
    std::wcout << "Input: ";
    std::getline(std::wcin, input);
    std::wcout << input << "\n";
    return 0;
}
person Barmak Shemirani    schedule 03.11.2018

Попробуйте эту функцию:

string changeTrCharacters(string text){
    replace (text.begin(),text.end(),-108,111); // ö to o
    replace (text.begin(),text.end(),-103,79);  // Ö to O
    replace (text.begin(),text.end(),-127,117); // ü to u
    replace (text.begin(),text.end(),-102,85);  // Ü to U
    replace (text.begin(),text.end(),-115,105); // ı to i
    replace (text.begin(),text.end(),-104,73);  // İ to I
    replace (text.begin(),text.end(),-89,103);  // ğ to g
    replace (text.begin(),text.end(),-90,71);   // Ğ to G
    replace (text.begin(),text.end(),-97,115);  // ş to s
    replace (text.begin(),text.end(),-98,83);   // Ş to Ş
    replace (text.begin(),text.end(),-121,99);  // ç to c
    replace (text.begin(),text.end(),-128,67);  // Ç to C
    return text;
}   

В основной функции измените строку cout << "Your input: " << input; на cout << "Your input: " << changeTrCharacters(input);

person Mehmet Bütün    schedule 13.05.2019