2012-06-14 2 views
20

Какие преимущества предлагает QString для std :: string? Может ли обычная std :: string хранить символы Unicode? Я пытаюсь написать программу, которая откроет различные файлы песен. Имя этих файлов может быть на разных языках. Я слышал, что использование обычной строки в таких случаях будет работать неправильно. Я хочу сохранить приложение независимо от QT и повторно использовать код, например, в android. Что ты предлагаешь .преимущество QString над std :: string

+4

http://www.joelonsoftware.com/articles/Unicode.html – Arafangion

+0

Это может помочь ответить на часть вас вопрос http://stackoverflow.com/questions/6028093/unicode-stdstring-class-replacement – kenny

+0

@Arafangion : это половина удовольствия ... вы также должны добавить все беспорядок о кодировании файловой системы на картинку – 6502

ответ

23

QString позволяет работать с Unicode, имеет более полезные методы и интегрируется с Qt хорошо. Он также имеет лучшую производительность, так как cbamber85noted.

std::string просто хранит байты, как вы их даете, он ничего не знает о кодировках. Он использует один байт на символ, но этого недостаточно для всех языков в мире. Лучший способ сохранить ваши тексты, вероятно, будет кодировкой UTF-8, в которой символы могут занимать различное количество байтов, а std::string просто не могут справиться с этим правильно! Это, например, означает, что метод length возвращает количество байтов, а не символов. И это только верхушка айсберга ...

+0

Я смотрю, чтобы избежать материала QT, есть ли другой выход? –

+0

Чтобы быть справедливым, std :: string также позволяет использовать unicode, хотя и предоставляется, это не значит, что данные находятся в определенной кодировке. Вы имеете в виду, что QString позволяет конвертировать в unicode? – Arafangion

+10

Vihaan, если вы пытаетесь избежать Qt, зачем вы его используете? Если вам нужно взаимодействовать с компонентами Qt, то использование QString упрощает вашу жизнь. – Joey

6

Я не знаком с QString, но большое преимущество std::string является то, что она является стандартом. Что касается Unicode, то нет проблем хранения UTF-8 в std::string; в зависимости от того, что вы делаете, Однако, возможно, лучше использовать std::wstring (обычно будет хранить UTF-16 или UTF-32).

Для сложных манипуляций с Unicode я бы предложил ICU. Но для много приложений достаточно просто хранить UTF-8.

+0

'QString' является разумным промежуточным звеном. Он не предлагает полную функциональность ICU, но он может делать простые вещи, такие как конверсии с/на UTF-8/16/32 – MSalters

+0

+1 Придерживание стандарта всегда является преимуществом. Сохраните типы spesific для использования структуры. Мне просто интересно, какие преимущества дает строка UTF-16 или UTF-32 в случае unicode и std :: string? – daramarak

+0

@daramarak Это зависит от того, что вы делаете со строками в коде. 'std :: string' действительно не намного больше, чем простой контейнер, с несколькими дополнительными функциями для замены некоторых из содержащихся _bytes_. Он не знает символов или кодировок, а тем более ничего, что связано с текстом. Если вы манипулируете текстом, может быть, что класс, представляющий текст, будет более уместным. Или, альтернативно, библиотека, которая обрабатывает 'std :: string' как текст UTF-8. –

4

Технически существует стандартный класс строк для хранения символов любого типа: std::basic_string. std::string и std::wstring - это не что иное, как специализация std::basic_string для char и wchar. Существуют также специализации std::u16string и std::u32string, предназначенные для хранения UTF-16 и UTF-32.

В любом случае, если вам нужно работать с Qt, QString, вероятно, всегда будет лучшей альтернативой любой стандартной библиотечной строке, поскольку вся инфраструктура Qt предназначена для работы с ней.

7

Если вы используете фреймворк Qt для написания своего программного обеспечения, вам лучше использовать QString. Простая причина в том, что почти все функции Qt, которые работают с строками, будут принимать QString. Если вы используете std :: string, вы можете оказаться в ситуациях, когда вам придется иметь typecase от одного к другому. Вы должны рассмотреть возможность использования std :: string, если ваше программное обеспечение вообще не использует Qt. Это сделает ваш код более переносимым и не зависит от дополнительной структуры, которую пользователи должны будут установить для использования вашего программного обеспечения.

+3

Использование фреймворка не должно быть основанием для того, чтобы позволить библиотеке фреймворка пронизывать весь код. Преобразование на границе ui - небольшая цена для оплаты, чтобы предотвратить блокировку вендора. – daramarak

+3

@ daramarak Вы правы, но тогда Qt - это не просто интерфейс. Он предоставляет все виды неинтерфейса, такие как Networking, SQL, XML, Scripting и т. Д. Поэтому, в зависимости от того, насколько широко используется инфраструктура, можно позвонить. – Pankaj

Смежные вопросы