Можно ли определять длину QString через sizeof?

Рейтинг: 0Ответов: 3Опубликовано: 05.11.2014

Есть следующий код инверсии:

   void Inversion(QString str)
    {
        QString result;
        for(int i = sizeof(str)-1, j = 0; i >=0; --i, ++j)
        {
            result[j] = str[i];
        }
        QMessageBox msg;
        msg.setText(result+"");
        msg.exec();
    }

Нашел этот пример в одном уроке по qt, то есть тут определяется размер самого стринга, а не количества символа в нем? Самое смешное, что я вначале даже купился на это, как и автор туториала, потому что он ввел слово из 5 букв, которое как раз сработало совпам с размером стринга), но все, что длиннее 5 символов, будет обрезаться. То есть нужно заменить на str.length()-1.

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

Ответы

▲ 3Принят

Нет, этот алгоритм обращения Юникодной строки неверен. Он не учитывает наличие combining characters. Пример: строка оё может быть представлена в Unicode как "o\u0308е", после «наивного» разворота превратится в "е\u0308о", то есть еö.

Обязательное чтение по теме от героя параллельного форума Джона Скита: OMG PONIES!!! (Перевод не нашёл.) Если вам скучно читать всё (я бы посоветовал, не пожалеете), поищите на странице «However, let’s take the fact».

▲ 2

Для ответа на вопрос:

 насколько валиден такой алгоритм при инверсии не только английских, но и русских символов?

достаточно такого самостоятельного эксперимента:

  printf("size of letter: %d (%s)\n", 
         (int)sizeof(str[0]), sizeof(str[0]) > 1 ? "Yes" : "No");

Заодно узнаете, какой unicode (16 или 32) используется.

Обновление

Вот вроде хорошая статья про юникод попалась (с кучей полезных ссылок и не слишком длинная).


Ответ на Ваш конкретный вопрос:

 А насколько валиден такой алгоритм при инверсии не только английских, но и русских символов?

Чисто русские (конечно, в смеси с ASCII тоже) тексты Вы можете безбоязненно переворачивать этим алгоритмом, поскольку диакритика и прочие композиции (в т.ч. суррогатные пары) в русском (про другие кириллические не знаю) тексте не используется.

▲ 1

QString хранит данные в юникод-кодировке. QString можно использовать для всех языков, поддерживаемых кодировкой.