【问题标题】:How to construct WebURL from std::wstring?如何从 std::wstring 构造 WebURL?
【发布时间】:2014-11-01 16:50:33
【问题描述】:

我正在使用Awesomium 编写一个 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_path.c_str() ) 时,编译器会抛出另一个错误:

src/main.cc(52) : 错误 C2664: 'Awesomium::WSLit' : 无法将参数 1 从 'const wchar_t *' 到 'const char *' 指向的类型是不相关的;转换需要 reinterpret_cast、C-style cast 或 函数式转换

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

编辑:

来自 Awesomium 文档:

WSLit() 是一个特殊的辅助函数,可让您声明 WebString 文字。我们的大多数 API 使用 UTF-16 字符串(用 WebString 包装),但我们添加了 WSLit(),因此您可以轻松声明 ASCII C 字符串。

【问题讨论】:

  • Awesomium 的WSLit 期望什么字符编码?
  • 您是否有可能遇到非 ASCII 数据?如果你这样做了,你在乎会发生什么吗?
  • 快速的 Google 显示您可能应该将 WebString 与 Unicode 字符串一起使用,例如WebURL url(WebString(ui_path.c_str())).
  • @David:URI 可以由 Unicode 字符组成(参见 An Introduction to Multilingual Web Addresses 以供参考)。
  • @IInspectable 我知道。我的问题是修辞性的。

标签: c++ winapi visual-c++ awesomium wstring


【解决方案1】:

WSLit 旨在从 ASCII 字符串构造 WebString 对象。由于您不想从 ASCII 构造 WebString,而是从头开始使用 UNICODE 字符串,因此您根本不需要使用 WSLit

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

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

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

typedef unsigned short wchar16;

根据您的编译器和编译器设置,这可能与wchar_t 相同,也可能不同。使用命令行选项/Zc:wchar_t 使用Microsoft 编译器进行编译时,wchar_t 被解释为本机数据类型。这是与unsigned short 不同的类型,WebString 的显式构造函数需要额外的转换:

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

不可能使用以下语法隐式调用WebString 的转换构造函数,因为它被声明为explicit

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

【讨论】:

  • 这导致编译器错误:src/main.cc(53):错误 C2248:'Awesomium::WebURL::WebURL':无法访问在类'Awesomium::WebURL'中声明的私有成员
  • 建议您添加适当的#include 指令。如果您的编译器无法从const wchar_t* 构造临时WebString 对象,请明确说明。我已经更新了答案。
  • std::wstring::c_str() 返回const wchar_t*,但WebString 没有接受wchar_t* 作为输入的构造函数。它有一个接受const wchar16* 的构造函数,但wchar16unsigned short 的typedef,所以你需要一个类型转换:WebURL url(WebString((const wchar16*)ui_path.c_str())); 或简单地说:WebURL url((const wchar16*)ui_path.c_str());
【解决方案2】:

如果问题是“将 std::wstring 转换为 const char*”,我通常使用这个函数,它工作正常:

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

然后,你可以通过调用result.c_str();获得char*

【讨论】:

  • 拜托,你能分享你的智慧,让我知道这如何破坏数据吗?
  • 源字符串中任何不是 ASCII 字符的字符都会出现乱码。
  • 没关系,我没有考虑过这种可能性,例如:“韩文”字符。谢谢。
【解决方案3】:

试试这个:

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 * 参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多