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 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.