На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Как переменной wstring присвоить значение char*?
    Имеется код
    ExpandedWrap disabled
      std::wstring strarg1 = args->args[0];
          std::wstring strarg2 = args->args[1];
          std::wstring strresult = strarg1 + strarg2;
          int i = strresult.length();

    При попытке присваивания переменым strarg1,strarg2 значений получаю ошибкуE0415 не существует подходящего конструктора для преобразования из "char *" в "std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>>" Probamysqludf H:\studyprojects\MySqlLib\MySQLPRoba1\Probamysqlud f\dllmain.cpp 46
    Как мне изменить код чтобы он скомпилировался?
      Преобразование из char в wchar_t не стандартизовано, т.к. зависит от национальных предпочтений пользователя, а не формальных правил языка программирования. Как и в случае WinAPI, тебе следует самому определить правила преобразования, на основе std::locale, например.

      Добавлено
      В качестве быстрого старта могу предложить что-то типа:
      ExpandedWrap disabled
        /* Преобразование UNICODE в ANSI с учётом локали.
           Параметры: str - исходная UNICODE-строка;
                      ct  - фасет std::ctype<wchar_t> из требуемой локали;
                            для русской локали должен браться из std::locale("russian").
           Возвращает результирующую ANSI-строку str.
        */
        std::string toNarrow(const std::wstring& str, const std::ctype<wchar_t>& ct =
                                        std::use_facet<std::ctype<wchar_t> >(std::locale::classic()))
        {
          std::vector<char> buf(str.length());
         
          if (!buf.empty()) ct.narrow(str.data(), str.data()+buf.size(), '\a', &buf[0]);
          return std::string(buf.begin(), buf.end());
        }
         
        /* Преобразование ANSI в UNICODE с учётом локали.
           Параметры: str - исходная ANSI-строка;
                      ct  - фасет std::ctype<wchar_t> из требуемой локали;
                            для русской локали должен браться из std::locale("russian").
           Возвращает результирующую UNICODE-строку str.
        */
        std::wstring toWide(const std::string& str, const std::ctype<wchar_t>& ct =
                                        std::use_facet<std::ctype<wchar_t> >(std::locale::classic()))
        {
          std::vector<wchar_t> buf(str.length());
         
          if (!buf.empty()) ct.widen(str.data(), str.data()+buf.size(), &buf[0]);
          return std::wstring(buf.begin(), buf.end());
        }
      По умолчанию будут использоваться стандартные правила, неработающие для нелатиницы. Использовать для русской локали можно как-нибудь вот так:
      ExpandedWrap disabled
        const std::locale          loc ("rus");        // под виндой этого хватит, в линухе другие имена локалей, что-то типа "ru_RU.UTF8"
        const std::ctype<wchar_t>& ct   = std::use_facet<std::ctype<wchar_t> >(loc);
        /* ... */
        std::wstring strarg1 = toWide(args->args[0], ct);
        std::cout << toNarrow(L"Первый параметр " + strarg1, ct);
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0275 ]   [ 16 queries used ]   [ Generated: 7.10.24, 07:39 GMT ]