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

Я же писал, что это на винде. А в линуксе не так.

Вернёмся к обсуждаемому утверждению:

Зачём Вы при обсуждении этого утверждения пишете фразу «Потому что на экран выводятся два символа, а не один.»

Короче. На винде компилятор читает UTF-8, а код (точнее строки в сегменте данных бинарника) генерирует в бинарник не в UTF-8. Имеет право.

И Вы могли бы не код функции писать, а то, как Вы строку синтаксически оформили. Тогда бы мы это увидели точнее.

std::string s = "абв";

Вот тут явно написано, что кодировка однобайтовая.
Нет же никаких макросов и букв кодировки.

Для сравнения:

// Character literals
    auto c0 =   'A'; // char
    auto c1 = u8'A'; // char
    auto c2 =  L'A'; // wchar_t
    auto c3 =  u'A'; // char16_t
    auto c4 =  U'A'; // char32_t

А вот что можно было сделать со строкой:

    auto S6 = u8R"("Hello \ world")"s; // std::string from a raw const char* before C++20, encoded as UTF-8,
                                       // std::u8string in C++20

А сколько их выводится, по-вашему?

А сколько их выводится, по-вашему?

Три.

Не. Три это в консоль. А байтов-то получается 6, как видно. То есть, каждая русская буква в UTF-8 это два символа ASCII. Таким образом, на экран OpenGL выводятся два символа. Соответственно, если передать туда всю строку из примера - “абв” - получится шесть символов, а не три.
Я ведь уже писал об этом ранее :man_shrugging:
Теперь только осталось непонятным, почему на винде это происходит не так :thinking:

А байтов-то получается 6, как видно. То есть, каждая русская буква в UTF-8 это два символа ASCII.

Это на линуксе. Надо это дописывать, чтобы всё было чётко и понятно.

У меня прям руки чешутся разобрать этот диалог с точки зрения элементарной формальной диалектической логики и лингвистики (анафора, это когда одно слово (антецедент) заменяется другим словом (например местоимением)), но жалко времени.

почему на винде это происходит не так

Потому что исходник программы написан без учёта требований переносимости (портируемости). Один компилятор в бинарник символы кладёт в одной кодировке (три байта под windows) а другой компилятор кладёт в другой бинарник символы в другой кодировке (шесть байт в линукс)

каждая русская буква в UTF-8 это два символа ASCII.

каждая русская буква в “utf-8” это два байта

user@localhost ~ $ echo -n "абс" > test.txt
user@localhost ~ $ xxd test.txt
00000000: d0b0 d0b1 d181

которые, эти байты, после интерпретируются как символы ASCII в момент вызова функции на linux. Но только потому что компилятор на linux положил строку в сегмент кода в кодировке utf-8. А компилятор windows положил строку в другой кодировке (вероятно Windows-1251). Потому что может.

Не понять может только Chat-GPT и джинн из DC. Человек человека бы понял. Учитывая, что “это на линуксе” было сказано изначально и повторено несколько раз.

Ну я этого не знал :man_shrugging: Я думал, что в 2024 такая мелочь как кодировка текста должна быть понятна всем программам. Особенно, таким серьёзным как компилятор. Особенно, если это один и тот же компилятор (просто под разные системы). При этом странно, что одни и те же входные данные он интерпретирует по-разному. Это и ведёт к подобным ошибкам. Ладно бы это были разные компиляторы - я бы ещё понял.

Ну понятно, что два. Просто я думал, что если это один компилятор (один брэнд - GCC), то и интерпретировать данные он должен одинаково. Ведь регулируют же всякую фигню. Комитет даже какой-то есть, который в языки стандарты вводит. Старые бородатые пенсионеры сидят и что-то там важное решают. А про этот момент, почему-то, ничего решили и не ввели :man_shrugging:
Не, я-то против ничего не имею. Учиться надо было лучше. Просто странно :man_shrugging:

про этот момент, почему-то, ничего решили и не ввели

А я думаю, что ты недостаточно долго выискивал нужное место в стандарте языка C++ и документации на GCC. Стопудово это где-то описано. Искать, конечно, я вместо тебя не буду.

Я не спорю, что это где-то описано. И против ничего не имею. Просто странно, что это не привели к какому-то общему знаменателю. Пусть компилятор, хотя-бы, предупреждение выдавал, что исходник в UTF-8, по-этому могут быть проблемы при переносе на разные системы.

Ситуация возникает не из-за того, в какой кодировке исходник, а из-за того, на какой операционке запускается компилятор (точнее, какая указана целевая платформа). Думаю, что можно и на линуксе настроить кросс-компиляцию так, что будет получаться бинарник с байтом-на-символ.

А как в GCC это указывается? Ключ командной строки же должен быть? Чёт не гуглится.

https://wiki.osdev.org/Target_Triplet

как в GCC это указывается?

Заранее, в момент когда компилируется сам GCC

А, ну ясно. Я думал, не так понял. Тогда не интересно. Проблема решается просто перекодированием исходников в ANSI. Если бы я сразу это вкурил, этой темы вообще бы не было.
Мне ещё mousepad в виртуальной машине писал, что с файлом main.cpp что-то не так. Но я не предал этому значение :man_facepalming: А зря.