C++ 如何从std::wstring构造WebURL?

C++ 如何从std::wstring构造WebURL?,c++,winapi,visual-c++,awesomium,wstring,C++,Winapi,Visual C++,Awesomium,Wstring,我正在用编写一个Win32应用程序。根据教程部分,我可以在视图中加载本地文件: 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/i

我正在用编写一个Win32应用程序。根据教程部分,我可以在视图中加载本地文件:

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\u path.c\u str())时,编译器会抛出另一个错误:

src/main.cc(52):错误C2664:“Awesomium::WSLit”:无法从转换参数1 “const wchar\u t*”到“const char*” 指向的类型是不相关的;转换需要重新解释转换、C样式转换或 函数样式转换

将其转换为
const char*
类型的正确方法是什么

编辑:

Awesomium文档:

WSLit()是一个特殊的帮助函数,允许您声明WebString文本。我们的大多数API都使用UTF-16字符串(用WebString包装),但我们添加了WSLit(),这样您就可以轻松地声明ASCII C字符串

如果问题是“convert std::wstring to const char*”,我通常使用此函数,它工作正常:

std::string wstringToString(const std::wstring& in){
     std::string result(in.begin(), in.end());
     return result;
}
然后,您可以通过调用
result.c_str()获得
char*

试试这个:

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);

但是,如果Awesomium打算在Windows下运行,WSLit构造函数应该支持std::wstring或wchar_t*参数。

WSLit
意味着从ASCII字符串构造
WebString
对象。由于您不想从ASCII构建
WebString
,而是从一开始就有一个UNICODE字符串,因此根本不需要使用
WSLit

以下代码行从
std::wstring
构造
WebURL

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

正如Remy Lebeau所指出的,对于任何给定的编译器或编译器设置,这可能无法编译
WebString
有一个
explicit
构造函数,采用
常量wchar16*
。Platform.h将
wchar16
定义为

typedef unsigned short wchar16;
根据您的编译器和编译器设置,这可能与
wchar\u t
相同,也可能不同。使用Microsoft编译器使用命令行选项进行编译时,
wchar\u t
被解释为本机数据类型。这与
unsigned short
不同,而
WebString
的显式构造函数需要额外的强制转换:

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

Awesomium的
WSLit
所期望的字符编码是什么?您是否有可能遇到非ASCII数据?如果你这样做了,你关心会发生什么吗?快速的Google显示你可能应该使用Unicode字符串,例如
WebURL url(WebString(ui_path.c_str())
@David:URI可以由Unicode字符组成(请参阅以供参考)。@IInspectable我知道这一点。我的问题是修辞性的。请你分享你的智慧,让我知道这是如何破坏数据的。在源字符串中不是ASCII字符的任何字符都会被弄乱。没关系,我没有考虑这个可能性,例如:“韩语”字符。谢谢。这会导致编译器错误:src/main.cc(53):错误C2248:“Awesomium::WebURL::WebURL”:无法访问在类“Awesomium::WebURL”中声明的私有成员。建议您添加适当的
#include
指令。如果编译器无法从
const wchar\u t*
构造临时
WebString
对象,请明确。我已经更新了答案。
std::wstring::c_str()
返回一个
const wchar\u t*
,但是
WebString
没有接受
wchar\u t*
作为输入的构造函数。它有一个接受
const wchar16*
的构造函数,但是
wchar16
unsigned short
的typedef,因此需要类型转换:
WebURL url(WebString((const wchar16*)ui_path.c_str())或简单地说:
WebURL((const wchar16*)ui_path.c_str())
WebURL url(reinterpret_cast<const wchar16*>(ui_path.c_str()));