Теперь Кью работает в режиме чтения

Мы сохранили весь контент, но добавить что-то новое уже нельзя

В C++, почему разными компиляторами возвращается разная длина строки?

Есть в C++ одна известная неприятность - не правильная длина строки при использовании length() или size(), если использовать не стандартный символ, отличающийся от английского, или кириллицу.
Но возникает это почему-то не всегда и везде.
  1. При компиляции в GCC, если исходник содержит английские или русские символы, то всё в порядке, длина строковых значений с русскими символами совпадает с реальной длиной.
  2. Стоит только добавить хоть один символ с доп. знаком, исходник конвертируется в utf-8 (хотя, в настройках CodeBlocks он и так был выбран, что странно как-то) и всё - каждый русский или другой не-английский национальный символ увеличивает длину строки.
  3. Проблема решилась с использованием Visual Studio: независимо от того, какой там символ (европейский национальный, а не экзотические вроде " о̸̝͕̘̀͛̓  ", такое в пролёте, увы), то length() и size() не ошибаются. Кодировка исходника при этом utf-8, конечно же.
Известно, почему с использованием VS неприятность исчезает? Очень хотел бы реализовать такое с помощью GCC.
ТехнологииПрограммирование+3
DJ Ruben
  ·   · 774
Лучший
Инженер путей сообщения – строитель  · 3 апр 2023
Неприятность в C++ это когда нельзя вызвать виртуальный метод из конструктора, всегда вызывается метод базового класса. Что же касается длин строк, то тут надо понимать, что такое «кодировка символов». Когда её придумывали то сделали её аж о 128 символах, посчитав, что для английского языка этого хватит. Не забыли про западноевропейские языки с их диакритикой, выделив под них ещё 128 символов. Итого 256 символов кодируются одним байтом. Прекрасно. Но катастрофически мало. Использование различных кодовых страниц ситуацию только усугубило. Поэтому и придумали в конце концов кодировку utf-8 содругие кодировки, в которых различные символы имеют различную длину в байтах. Первые 128 так и остались однобайтовыми, а вот все остальные могут быть двухбайтовыми и даже больше. Теперь давайте зададимся вопросом, а что же тогда такое «длина строки»? В чём она измеряется? В байтах, словах или в символах? А если там в строке комбинирующие символы их как вообще считать? Вот и получается что у одного компилятора длина считается по байтам, у другого – по символам. И настраивается в настройках компиляции, коим несть числа.
1 эксперт согласен