LINUX.ORG.RU

C++ vs Unicode


0

0

Появилось желание переписать одну программу на грамотную работу с unicode.

В ней используется std::string, который меняется на std::wstring, но тогда начинается секс с тем, что stream не умеет wstring... да ничего там не умеет wstring.

Вот и интересуюсь, как на самом деле писать программы, использующее уникод? (простой пример: программа которая получает слово и выдает колличество символов, работать должно в utf-8 локали)

★★★★★

Ответ на: комментарий от catap

т.е. решение которое будет тут, потенциально будет использоваться в комерческом проекте.

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

ну так и быть объясняю для ленивых,
1)glib это не glibc
2)glib имеет lgpl лицензию(т.е. полностью подходит для комерчиских проектов)
3)среди многих ОС на которые она пересена есть и windows

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

пардон, спутал, все, понял, еще раз извеняюсь.

но надежда на решение силами плюсов все еще интересует ;)

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

ну, наверное можно, только геморно,
есть такие функции как mbrtowc и mbsrtowcs (ANSI C)
mbr это несколько символьное представление симовола,
в том числе и utf-8,
но эта функция зависит от локали,
т.е. чтобы заработала правильно в начале надо сказать setlocale
по-моему в windows есть только "C" локаль так что,

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

Спасибо за вариант. Чувтсвую буду очередным велосипидистом. Блин.

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

Утилита это cgi'шка (почему имено плюсы не спрашивайте), предлагаешь делать зависимость cgi'шки от QT?..

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

ну все зависит от библиотеки С, я пользовался борладовской
она поддерживала только "С", хотя приложения написанные
с использованием gettext прекрасно работают.

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

да и главный недостаток я забыл упомянуть,
ведь локаль глобальна и если например установлена в ru_RU.UTF-8,
то utf-8 содержащий французкий может и не понять,

так что я бы остановился на glib и его обвязке для С++ glibmm

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

Ответ сильно зависит от того что тебе еще нужно помимо Unicode. Если, предположим, regexp'ы, сеть, XML, к БД цепляться и т.д, то почему бы и нет? Qt неплохо спроектирована и отлично переносится под оффтоп. К тому же в Qt4 можно выкинуть нафиг GUI, оставив только core-классы.

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

Просто вопрос в том, что это две разные cgi'шки которые я разрабатываю.

Одна на работе, комерческая, там скорее всего с qt пошлют (цена).... Хотя вообще вкусная штука, верю...

catap ★★★★★
() автор топика

> В ней используется std::string, который меняется на std::wstring, но
> тогда начинается секс с тем, что stream не умеет wstring... да ничего
> там не умеет wstring.

Все оно умеет. Wide-потоки надо использовать просто - wistream/wostream
и wcin/wcout, соответственно.

> Вот и интересуюсь, как на самом деле писать программы, использующее
> уникод? (простой пример: программа которая получает слово и выдает
> колличество символов, работать должно в utf-8 локали)

А вот тут - затык-с. Дело в том, что нигде в стандарте плюсов не
оговорено, что wstring - это уникод. Это wide char, который
гарантированно будет не короче short, но какая там кодировка, строго
говоря, неизвестно. Все зависит от конкретной реализации libc++.
Соответственно, преобразование в системную локаль (что требуется при
вводе/выводе) тоже в общем случае не определено. Например, в g++ при
выводе через wide-потоки все не-ASCII символы просто отсекаются. Есть
подозрение, что там только одна плюсовая локаль - которая
locale::classic(), она же "C".

В-общем, если нужен именно уникод, смотри в сторону gtkmm. Там есть
класс ustring для работы с UTF-строками, с интерфейсом std::string
(http://www.gtkmm.org/docs/glibmm-2.4/docs/reference/html/classGlib_1_1ustring...)

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

Спасибо. Почитал.

gtkmm, да, похоже это единсвенное что есть.

Что касается wstring, почитал, буду думать, но чувствую что не то.

Что касается ibm -- монстр, что с него взять... Верю что это очень вкусная штука, но сил разбераться пока нету.

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

> Да, кроме gtkmm еще можно попробовать ICU:
> Хотя это тот еще монстр.
>

Вроде не монстр.
Мои коллеги пользуются и довольны.
Документации полно на http://icu.sourceforge.net/

Onanim
()
Ответ на: комментарий от catap

> gtkmm, да, похоже это единсвенное что есть.
>
> Что касается wstring, почитал, буду думать, но чувствую что не то.

Я тут тоже несколько поковырялся из интереса, нашел кое-что интересное.

http://gcc.gnu.org/onlinedocs/libstdc++/22_locale/codecvt.html

http://www.boost.org/libs/serialization/doc/codecvt.html

Последнее вроде кроссплатформенное.

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

Последнее именно то. что надо. Спасибо.

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

В догонку...

После ряда экспериментов с glibc и плюсовыми локалями было установлено,
что оно таки работает. wchar_t там в любой локали уникодный, так что
если локаль UTF-8 (а ее такую никто не мешает выставить для отдельно
взятого потока), то codecvt будет работать корректно, и,
соответственно, fstream будет перекодировать строки при чтении/записи.
Единственная бяка - wcin/wcout не будут перекодировать автоматом, даже
если для них явно сделать imbue().

int19h ★★★★
()

"Уж сколько раз твердили Сене" (c) "Грамотно" - это с использованием gettext.

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

А по подробней можно, как gettex влияет на внутреннее предствевление информации в в программе?

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