LINUX.ORG.RU

В какой кодировке хранить строки внутри приложения?


0

0

Добрый день. Вот задался таким вопросом. Думаю, какой вариант выбрать:
1. Все строки внутри приложения хранить и обрабатывать в Glib::ustring (в случае с gtkmm, или в каком-нибудь другом строковом классе с поддержкой юникода, когда приложение пишется не под GTK) и преобразовывать в кодировку локали только тогда, когда необходимо использовать строку как имя файла, записать в файл, вывести на консоль и т. п...
2. Все строки внутри приложения хранить в кодировке локали и преобразовывать в UTF только тогда, когда требуется, например, передать строку функциям gtkmm (опять же в случае, когда приложение пишется под GTK).

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

Поделитесь, пожалуйста, своим опытом: какой вариант вы считаете лучшим, и какие проблемы он за собой потянет. Спасибо.


>далеко не все библиотеки поддерживают юникод

? А что за библиотеки планируется использовать, если не секрет

Ximik
()

UTF8, ибо GTK+ и Glib работают только с ней

yoghurt ★★★★★
()

Принцип простой, похож на ваш первый вариант: для _текста_ внутри используем юникод, будь то std::wstring, Glib::ustring, QString или что-нибудь другое. Для обмена данными с внешним миром всегда преобразуем _текст_ в _массив байт_ с помощью какой-то кодировки, вообще говоря, специфичной для каждого конкретного случая. А библиотеки, не поддерживающие юникод - это просто один из этих случаев.

const86 ★★★★★
()
Ответ на: комментарий от Ximik

> ? А что за библиотеки планируется использовать, если не секрет
Ну я вообще-то спрашиваю не для какого-то конкретного случая... Просто, какую библиотеку не возьмешь - она все принимает через std::string - откуда мне знать, что ей можно передавать, а что нельзя.


2ALL: да, думаю вы правы - все-таки лучше использовать юникод...

Вот только...
> Принцип простой, похож на ваш первый вариант: для _текста_ внутри используем юникод, будь то std::wstring, Glib::ustring, QString или что-нибудь другое.

Думаю, лучше везде использовать std::string, хранящую текст в UTF-8, а Glib::ustring использовать только тогда, когда необходимо работать с отдельными символами строки, чтобы код как можно меньше зависел от какой-то конкретной библиотеки (в данном случае Glib). Полагаю, это более правильное решение. Или я ошибаюсь?

riYu
() автор топика
Ответ на: комментарий от riYu

> Думаю, лучше везде использовать std::string, хранящую текст в UTF-8, а Glib::ustring использовать только тогда, когда необходимо работать с отдельными символами строки, чтобы код как можно меньше зависел от какой-то конкретной библиотеки (в данном случае Glib).

std::wstring - и от сторонних библиотек не зависит, и символы можно доставать.

const86 ★★★★★
()
Ответ на: комментарий от const86

>> Думаю, лучше везде использовать std::string, хранящую текст в UTF-8, а Glib::ustring использовать только тогда, когда необходимо работать с отдельными символами строки, чтобы код как можно меньше зависел от какой-то конкретной библиотеки (в данном случае Glib).

> std::wstring - и от сторонних библиотек не зависит, и символы можно доставать.

С другой стороны, если, например, приложение пишется под glib, использует глибовские фичи везде и всюду и выбросить в будущем glib не представляется разумным, то почему бы не использовать и строки оттуда же?

P.S. Остановите меня, если начну флеймить сам с собой...

const86 ★★★★★
()
Ответ на: комментарий от const86

Ну, думаю, вопрос можно считать закрытым. Большое спасибо всем за помощь.

riYu
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.