![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Уважаемые форумчане.
Встал вопрос об использовании юникода в кросплатформенном приложении, т.е. написать все полностью на юникоде. Но вот на какие проблемы я накнулся. В С++ есть типы wchar_t и std::wstring. Но вопрос в том что в виндоузе и линуксе размеры wchar_t разные. Я так понимаю в виндоузе это юникод (2 байта) в никсах - UTF-32 (4 байта). Как с ним работать? Виндоузовские функции использовать нельзя, данные будут передоватся по сети, братся будут из базы данных MySQL родной драйвер которого тоже очень сомнительно поддерживает wchar_t, т.е. вообще не поддерживает - mysql_query принимает const char*. Но с этим я как нибудь разберусь, вроде нашел решение на сайте MySQL пока не пробовал правда. Думаю если использовать std::wstring, то использовать его везде и вообще отказатся от std::string, чтобы не мучатся с конвертациями. Но и тут проблема, есть некоторые библиотечные функции которые понятия не имеют что такое юникод, давай им на вход const char* и все тут. Правда тут можно и без юникода, но не очень то красиво когда половина проекта юникод, половина АНСИ. пока что это, но в процессе я уверен еще возникнут. Может кто нибудь сталкивался с подобным? Я так понимаю C++ и юникод не очень то дружат в плане переносимости да? |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
||||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
библиотека стороннего производителся - крайний случай. нужен метод средствами стандартного C++. Но все равно спасибо
Добавлено через 6 минут и 39 секунд да, еще проблема.. std::exception не работает с юникодом. Все стандартные исключение принимают const char*, я не собираюсь писать
но все же хотелось бы привести программу к одному стандарту, чтобы не было половина юникод, половина анси |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
azesmcar, что нужно будет передать в те библиотечные функции, если у тебя юникодовая строка с китайскими иероглифами?
по поводу исключений - кидай свои, отнаследованные от std::exception |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Нет, в принципе иероглифы никуда передавать не собираюсь.. ![]() у меня что-то вроде кросплатформенного фреймворка написанного с нуля на чистом С++, нормально работает но с АНСИ, теперь мне его переделывать надо под Юникод из за специфики проекта. исключение все наследованы, только вот what возвращяет const char* а не wchar_t, а переопределять возвращяемый тип виртуальной функции нельзя. Но основная проблема все таки с размерами wchar_t, клиент тоже кросплатформенный - очень вероятна ситуация что сервер будет под юникс а клиент под виндоуз и передача информации с сервера в таком случае в юникод формате не видется возможной. Т.е. я сервер отправит 12 байт - что в принципе с его точки зрения строка размером в 3 символа, а для сервера - 6. Да и скорость работы программы в сети интернет критична, возможна огромная нагрузка на сервер. так что нежелательно использование 32х битных символов, тем более что иероглифы поддерживать навряд ли будем. ![]() Добавлено через 3 минуты и 15 секунд оффтоп надо же какие у нас подписи похожие ![]() Это сообщение отредактировал(а) azesmcar - 4.3.2009, 19:32 |
|||
|
||||
pan2004 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 1 Всего: 9 |
azesmcar, если полностью корректная поддержка уникода не является необходимостью, то можно написать простую функцию преобразования 4х байтовой wstring строки в массив байтов для передачи по сети(где один символ 2 байта) и наоборот В простых случаях старшие байты будут нулями, и их можно просто добавлять/убирать когда надо
|
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
этот вариант тоже один из крайних, потому что в базу эти строки уже не запихнешь, надо менять кодировку. На данный момент пишу преобразование UTC - UTF8. Думаю буду переделывать все строки в UTF8. Но все равно всем большое спасибо, я так понял стандартного ответа для этой ситуации не существует ![]() |
|||
|
||||
Torsten |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 10.6.2008 Где: Pskov Репутация: 3 Всего: 7 |
Те проще работать с char, и самому все преобразования делать - тогда получится кросс-платформенно и без библиотек строннего производителя.
typedef std::vector<char> UtfString; Ты только должен знать, какая кодировка на входе и какая на выходе и преобразования делать. --------------------
We have no begining, we have no end. We are infinite. |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
azesmcar, может попробуешь создать 2 собственных класса строк - для внутреннего и внешнего использования?
так чтобы класс для внутреннего использования имел функцию преобразования в char*, а внешний имел на любой платформе одинаковое побитовое. тогда останется только добавить функции преобразования из одного в другой (кстати, при реализации этих функций можно буудет увидеть все подводные камни, что бы не заметил при использовании wchar_t* и char*) оффтоп а подпись я у тя и скоммуниздил когда-то давно, заменив картинки линками ![]() |
|||
|
||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Torsten,
ну наверное не совсем вектор, но специализировать std::string можно. Alek86, для внутреннего мне std::string а хватит..а для внешнего наверное так и поступлю. Специализирую basic_string для типа short и напишу для него функцию конвертации в UTF-8 (std::string) - над чем сейчас и ломаю голову.. если у кого есть - поделитесь, башка трещит уже от этих нулей и едениц ![]() Добавлено через 3 минуты и 38 секунд в интернете нашел парочку реализаций, работают не нормально и не оптимально...я пытаюсь сделать только с помощью битовых операций.
оффтом ![]() только заметил что у меня ссылок нет ![]() |
||||
|
|||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
кстати поскольку проблема потихоньку находит решение добавлю материалы от себя
http://ru.wikipedia.org/wiki/UTF-8 - стандарт UTF-8 исходники добавлю когда заработает для китайского ![]() |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
решил сделать немнго по другому..у меня в фреймворке написан шаблон конвертера типов и как оболочка для него - lexical_cast.
код конвертации в последней специализации шаблона...какие нибудь умозаключения по этому поводу есть? может как нибудь можно улучшить?
|
|||
|
||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
и его обратное преобразование... Пример
|
||||
|
|||||
chaos |
|
||||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
Сильно ![]() |
||||
|
|||||
Quartz |
|
|||
Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 28.6.2008 Репутация: 1 Всего: 4 |
В gcc есть ключ -fshort-wchar (2-байтовые wchar_t). |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |