Как построить WebURL из std :: wstring?

0

Я пишу приложение Win32 с Awesomium. В разделе урока я могу загрузить локальный файл в моем представлении:

WebURL url(WSLit("file:///C:/dev/project/util/ui/index.html"));
view_->web_view()->LoadURL(url);

Это работает так, как ожидалось.

Когда я пытаюсь передать функцию std::wstring в WSList:

std::wstring ui_path = L"file:///" + install_path + L"/util/ui/index.html";
WebURL url(WSLit(ui_path));
view_->web_view()->LoadURL(url);

Я получаю ошибку компилятора:

src/main.cc(52): ошибка C2664: "Awesomium :: WSLit": невозможно преобразовать параметр 1 из "std :: wstring" в "const char". Нет доступных пользовательских операторов преобразования, которые могут выполнять это преобразование, или оператор не может быть вызван

Когда я пытаюсь передать WSLit( ui_path.c_str() ) компилятор выдает еще одну ошибку:

src/main.cc(52): ошибка C2664: "Awesomium :: WSLit": невозможно преобразовать параметр 1 из 'const wchar_t *' в 'const char *' Указанные типы не связаны; для преобразования требуется reinterpret_cast, литье в стиле C или функция-стиль

Каков правильный способ конвертировать его в const char * type?

Редактировать:

Из документации Awesomium:

WSLit() - специальная вспомогательная функция, которая позволяет объявлять литералы WebString. Большая часть нашего API использует строки UTF-16 (завернутые в WebString), но мы добавили WSLit(), чтобы вы могли объявить C-строки ASCII с минимальной суматохой.

  • 0
    Какую кодировку символов ожидает WSLit от WSLit ?
  • 1
    Возможно ли даже отдаленно, что вы можете столкнуться с данными, отличными от ASCII? Если вы делаете, вас волнует, что произойдет?
Показать ещё 3 комментария
Теги:
visual-c++
winapi
wstring
awesomium

3 ответа

2
Лучший ответ

WSLit предназначен для WebString объекта WebString из строки ASCII. Поскольку вы не хотите создавать WebString из ASCII, а скорее имеете строку UNICODE с самого начала, вам просто не нужно WSLit использовать WSLit.

Следующая строка кода создает WebURL из std::wstring:

WebURL url(WebString(ui_path.c_str()));

Как отметил Remy Lebeau, это может не компилироваться для каких-либо заданных параметров компилятора или компилятора. WebString имеет explicit конструктор, содержащий const wchar16*. Platform.h определяет wchar16 как

typedef unsigned short wchar16;

В зависимости от ваших настроек компилятора и компилятора это может быть или не быть таким же, как wchar_t. При компиляции с компилятором Microsoft, используя параметр командной строки /Zc: wchar_t, wchar_t интерпретируется как собственный тип данных. Это отличается от unsigned short, а явный конструктор WebString требует дополнительного приведения:

WebURL url(WebString(reinterpret_cast<const wchar16*>(ui_path.c_str())));

Неявно WebString конструктор преобразования WebString используя следующий синтаксис, невозможно, поскольку он объявлен explicit:

WebURL url(reinterpret_cast<const wchar16*>(ui_path.c_str()));
  • 0
    Это приводит к ошибке компилятора: src / main.cc (53): ошибка C2248: «Awesomium :: WebURL :: WebURL»: невозможно получить доступ к закрытому члену, объявленному в классе «Awesomium :: WebURL»
  • 0
    Рекомендуем добавить соответствующие директивы #include . Если ваш компилятор не может WebString временный объект WebString из const wchar_t* , WebString это явно. Я обновил ответ.
Показать ещё 1 комментарий
-1

Попробуй это:

std::wstring ui_path = L"file:///" + install_path + L"/util/ui/index.html";
std::string cui_path( ui_path.begin(), ui_path.end() );
WebURL url(WSLit(cui_path));
view_->web_view()->LoadURL(url);

Тем не менее, IMHO, если Awesomium предназначен для работы под Windows, конструктор WSLit должен поддерживать либо аргумент std :: wstring, либо wchar_t *.

-3

Если вопрос "convert std :: wstring to const char *", я обычно использую эту функцию, и она отлично работает:

std::string wstringToString(const std::wstring& in){
     std::string result(in.begin(), in.end());
     return result;
}

И тогда вы можете получить char*, вызвав result.c_str();

  • 1
    Хм .... это не конвертирует данные. Это портит данные.
  • 1
    пожалуйста, вы можете поделиться своей мудростью и дать мне знать, как это портит данные?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню