带有setlocale的C ++土耳其语字符串问题

时间:2018-11-03 01:25:35

标签: c++ windows 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)

2 个答案:

答案 0 :(得分:0)

如果您的系统语言不是土耳其语,则"çığöşü"会被编译为英语或您具有的任何设置,它将以土耳其语中的不同字符集进行匹配。除非在编译器设置中,否则您将* .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(不使用特定于Visual Studio的_setmode

#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;
}

答案 1 :(得分:0)

尝试此功能:

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);