如何使用L前缀不加引号的字符串?

时间:2011-08-22 20:45:28

标签: c++ string encoding

  

可能重复:
  Compare std::wstring and std::string

我有一个愚蠢的问题。我知道我可以在字符串之前使用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,但仍然没有通过比较得到正确的结果。

3 个答案:

答案 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::wstringwchar_t*

如果你不能改变函数返回类型,你需要从stringwstring的转换,这不是可以在编译时完成的 - 你需要调用一个函数去做吧。这个问题已被多次询问,有许多不同的变化,这里有一个例子: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);