Проблема с вводом UTF-8

#c #utf-8 #c 17 #utf-16 #wstring

#c #utf-8 #c 17 #utf-16 #wstring

Вопрос:

У моего простого кода нет проблем с японскими символами при выводе, но по какой-то причине он не принимает ввод должным образом, ему чего-то не хватает?

 int main()
{
    _setmode(_fileno(stdout), _O_U16TEXT);
    SetConsoleCP(CP_UTF8);

std::wstring s = L"こんにちは, 世界!nHello, World!";
std::wcout << s << endl;
std::wstring test;

getline(wcin, test);

std::wstring test2 = test;
std::wcout << test2 << endl;

std::wstring test3 = test2;
std::wcout << test3 << endl;
std::wcout << "Press ENTER to exit.";
std::wcout << "n";
cin.get();
return 0;
}
  

Комментарии:

1. Я не вижу здесь ничего, где вы могли бы использовать UTF-8. Вы используете wchar_t s, которые не являются UTF-8. Кодовые страницы не применяются к wchar_t вводу.

2. В вашем коде отсутствует должным образом функционирующая ОС. Ввод Unicode в консоли Windows не работает, и это вряд ли изменится в ближайшее время.

3. @n.’местоимения’m. У неверных или японских пользователей Windows может возникнуть проблема. Мой ответ работает.

4. @MarkTolonen Хм, похоже, я перепутал его с вводом UTF-8, который не работает.

Ответ №1:

Этот код работал для меня в командной строке Windows 10.

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

using namespace std;

int main()
{
    _setmode(_fileno(stdout), _O_WTEXT);  // or _O_U16TEXT, either work
    _setmode(_fileno(stdin), _O_WTEXT);

    wstring s = L"こんにちは, 世界!nHello, World!";
    wcout << s << endl;

    wstring test;
    getline(wcin, test);
    wcout << test << endl;
    return 0;
}
  

Вывод:

 C:>test
こんにちは, 世界!
Hello, World!
你好马克!                << input line
你好马克!
  

Комментарии:

1. Большое вам спасибо, не знал о stdin.