Символы в строке в линуксе

Есть вот такой код:

#include <iostream>

int main()
{
	std::string s = "абв";
	size_t length = s.length();
	std::cout << "Length: " << length << std::endl;

	for (size_t i = 0ull; i < length; ++i)
	{
		unsigned char charId = static_cast<unsigned char>(s[i]);
		std::cout << (int)charId << " ";
	}
	std::cout << "" << std::endl;

	return 0;
}

На винде правильно работает. Выдаёт:

Length: 3
224 225 226

А в линуксе выдаёт какую-то дичь:

Length: 6
208 176 208 177 208 178

Это почему так? :thinking: Как исправить?
Так только с русскими буквами. Остальные символы нормально работают.

Там utf-8.
Это и есть нормально )

То есть, перед выводом надо конвертить в UTF-16? :thinking:

А оно не выводит?
UTF-16 точно вряд ли поможет.

Дело не в выводе. Мне надо, чтобы коды символов в строке совпадали с их кодами из таблицы ASCII. Это для OpenGL. Иначе он текстурный шрифт неправильно выводит. Я просто до этого с русскими буквами в линуксе ни разу не тестил. Думал - какая разница-то. Не знал, что в линуксе UTF-8.

Ну или в ANSI там, или ещё во что-то. Однобайтовые символы это же ANSI, вроде :thinking:

Нашёл такой код:

std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
std::wstring wstr = converter.from_bytes(utf8str);
std::wcout << wstr << std::endl;

По заявлению автора, это должно преобразовать UTF-8 в wstring. Но оно, почему-то, из русского “абвг” делает “abvg” :dizzy_face: Это странно как-то.
Это я в линуксе запускаю. В винде и без этого работает.

Ещё вот такое нашёл:
Снимок экрана 2024-02-09 170651
Если правильно понял - если строка UTF-8 содержит только символы из таблицы ASCII, то коды символов идентичны.
Но это, наверное, про старую версию ASCII, где русских букв ещё не было :thinking:

Если надо во что-то конвертировать, то в не-юникодную кодировку, видимо CP1251.
Но звучит странновато, что OpenGL не может справиться с юникодом. Может дело в том коде?

Всё логично. Если не использовать библиотеки, то можно выводить только однобайтовые символы.

Это я уже понял. Сейчас ищу, как это сделать. Но похоже, что в стандартной библиотеке нет такой функции :thinking: