我有一个愚蠢的问题。我知道我可以在字符串之前使用L前缀将其用作wchar_t *(对于unicode字符串)但我不知道如何在变量之前使用此前缀。我的意思是
std::wstring str = L"hello";
我知道上面的代码,但这个怎么样:
string somefunction();
std::wstring str1 = L(somfunction())
这说'找不到'L'标识符
问题是如何将L前缀应用于不带引号的字符串?
void wordNet::extractWordIds(wstring targetWord)
{
pugi::xml_document doc;
std::ifstream stream("words0.xml");
pugi::xml_parse_result result = doc.load(stream);
pugi::xml_node words = doc.child("Words");
for (pugi::xml_node_iterator it = words.begin(); it != words.end(); ++it)
{
std::string wordValue = as_utf8(it->child("WORDVALUE").child_value());
std::wstring result (wordValue.size (), L' ');
std::copy (wordValue.begin (), wordValue.end (), result.begin ());
if(!result.compare(targetWord))
cout << "found!" << endl;
}
}
actully我想将targetWord与wordValue进行比较。你看到我将wordValue转换为wstring,但仍然没有通过比较得到正确的结果。
答案 0 :(得分:4)
你不能,它是字符串文字本身的一部分。它不是运营商。
string-literal:
encoding-prefixopt "s-char-sequenceopt"
encoding-prefixoptR raw-string
encoding-prefix:
u8
u
U
L
另外,我建议您avoid using std::wstrings,除非您进行低级别的Windows API调用。
修改强>
如果使用PUGIXML_WCHAR_MODE
编译pugixml,请使用:
if(it->child("WORDVALUE").child_value() == targetWord)
cout << "found!" << endl;
否则使用:
if(it->child("WORDVALUE").child_value() == pugi::as_utf8(targetWord))
cout << "found!" << endl;
我建议在没有PUGIXML_WCHAR_MODE
的情况下进行编译并将函数更改为:
void wordNet::extractWordIds(std::string targetWord)
{
// ...
for (pugi::xml_node_iterator it = words.begin(); it != words.end(); ++it)
if(it->child("WORDVALUE").child_value() == targetWord)
cout << "found!" << endl;
}
让来电者担心passing a UTF-8 targetWord
。
答案 1 :(得分:1)
您必须somfunction
返回std::wstring
或wchar_t*
。
如果你不能改变函数返回类型,你需要从string
到wstring
的转换,这不是可以在编译时完成的 - 你需要调用一个函数去做吧。这个问题已被多次询问,有许多不同的变化,这里有一个例子:C++ Convert string (or char*) to wstring (or wchar_t*)
答案 2 :(得分:1)
你不能。
您应该在wstring中复制字符串的结果,例如:
std::string tmp = somefunction ();
std::wstring result (tmp.size (), L' ');
std::copy (tmp.begin (), tmp.end (), result.begin ());
来自pugixml文档:
有些情况下,你必须在UTF-8和wchar_t编码之间转换字符串数据;为此目的提供了以下帮助函数:
std::string as_utf8(const wchar_t* str);
std::wstring as_wide(const char* str);