Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: wxWidgets - в чём разница между ToUTF8/FromUTF8 и mb_str(wxConvUTF8)  (Прочитано 13935 раз)
0 Пользователей и 1 Гость смотрят эту тему.
DemonicAlligator
Гость
« : 11-12-2007 09:08 » 

Есть приложение. А конкретно - bwx-console.exe (консоль управления бэкап-сервером bacula). Кросс-компилировано под линуксом в windows (попытка собрать под виндой привела в состояние злобного бешенства, но так и не увенчалась успехом). Причина издевательства над приложением - хроническое непонимание русских букв в именах файлов и каталогов именно консолью. Рытьё в исходниках привело к нахождению и замене конструкций ct->Write (str.mb_str(wxConvUTF8)) (отправка команд серверу)  и Print(po->str, po->status)(передача ответов сервера заинтересованным получателям)  на ct->Write (str.ToUTF8()) и Print(wxString::FromUTF8(po->str), po->status) соответственно. Всё замечательно заработало. Теперь хочется странного - понять, почему Улыбаюсь
Записан
DemonicAlligator
Гость
« Ответ #1 : 11-12-2007 17:05 » 

мда... чёт я ну никак не могу понять... в итоге всё упираеца в одну функцию...

    static wxString FromUTF8(const char *utf8)
      { return wxString(wxConvUTF8.cMB2WC(utf8)); }
    static wxString FromUTF8(const char *utf8, size_t len)
    {
      size_t wlen;
      wxWCharBuffer buf(wxConvUTF8.cMB2WC(utf8, len == npos ? wxNO_LEN : len, &wlen));
      return wxString(buf.data(), wxConvLibc, wlen);
    }
    const wxCharBuffer utf8_str() const
      { return wxConvUTF8.cWC2MB(wc_str(wxConvLibc)); }
    const wxCharBuffer ToUTF8() const { return utf8_str(); }

const wxCharBuffer wxString::mb_str(const wxMBConv& conv) const
{
    return conv.cWC2MB(c_str(), length() + 1 /* size, not length */, NULL);
}


ЗЫ. ну не люблю я С, не люблю...
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 11-12-2007 18:05 » 

Синий Аллигатор,  видно, что есть конвертация utf8 <-> unicode-16. Возможно, в первом случае строка  хранилась в ином формате, чем рассчитывал разработчик.
Во всяком случае, str.ToUTF8() выглядит куда понятнее, чем str.mb_str(wxConvUTF8).
Кстати, что в доках написано?

Так почитабельнее будет:
Код: (C++)
static wxString FromUTF8(const char *utf8)
{
        return wxString(wxConvUTF8.cMB2WC(utf8));
}

static wxString FromUTF8(const char *utf8, size_t len)
{
        size_t wlen;
        wxWCharBuffer buf(wxConvUTF8.cMB2WC(utf8, len == npos ? wxNO_LEN : len, &wlen));
        return wxString(buf.data(), wxConvLibc, wlen);
}

const wxCharBuffer utf8_str() const
{
        return wxConvUTF8.cWC2MB(wc_str(wxConvLibc));
}

const wxCharBuffer ToUTF8() const
{
        return utf8_str();
}

const wxCharBuffer wxString::mb_str(const wxMBConv& conv) const
{
        return conv.cWC2MB(c_str(), length() + 1 /* size, not length */, NULL);
}
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
DemonicAlligator
Гость
« Ответ #3 : 12-12-2007 07:44 » 

нашёл... ещё раз перечитал документацию, залез в исходники, и таки выяснил:


Returns multibyte (C string) representation of the string. In Unicode build, converts using conv's cWC2MB method and returns wxCharBuffer. In ANSI build, this function is same as c_str. The macro wxWX2MBbuf is defined as the correct return type (without const).

Вопрос снят... Сама прога изначально собиралась на wxWidgets 2.7 а там UTF8 поддерживается не полностью...
« Последнее редактирование: 12-12-2007 07:50 от Синий Аллигатор » Записан
Algor
Гость
« Ответ #4 : 31-07-2009 19:19 » new

так и что делать?
bwx-console у тебя заработала?
можешь выложить свою версию?
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines