如何搜索从wstringstream获得的宽字符串中的文本

时间:2015-07-01 18:50:06

标签: c++ unicode substring stdstring

我有一个单词流,在循环的每次运行中都给我一个单词std::string。但理想情况下,这应该是std::wstring。所以在我获得字符串后,我将其转换为std::wstring。我输入std:wstringstream。最后,在处理完所有流中的单词后,我将std:wstringstream转换为std::wstring,然后在其中搜索所需的术语(最初为std::wstring)。这是我的代码:

while (stream)
{
    std::string word = stream->getWord();
    boost::trim(word);    

    std::wstring longWord(word.length(), L' '); // Make room for characters
    std::copy(word.begin(), word.end(), longWord.begin());

    fMyWideCharStream << longWord;
    stream->next();
}

std::wstring fContentString = fMyWideCharStream.str();

size_t nPos = fContentString.find(fSearchString, 0); //fSearchString is std::wstring

while(nPos != std::wstring::npos)
    {
        qDebug() << "Pos: " << nPos << endl;
        nPos = fContentString.find(fSearchString, nPos+1);
    }

我有这个字符串:被动攻击性处理被动攻击,失去幸福&amp;断开连接版权所有©2014 ,其中©是一个广泛的角色。作为std::string,它占据两个位置。作为std::wstring它需要1,这就是我想要的。但是,在尝试使用值fSearchString的{​​{1}}时,我仍然会得到值96,而它应该是95,因为此字符串现在为L"2014"

知道我应该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:1)

由于原始string不是仅限ASCII - 它包含多字节字符“©”,因此使用逐字符转换从string转换为wstring是错误的。因此两者

std::wstring longWord(word.length(), L' '); // Make room for characters
std::copy(word.begin(), word.end(), longWord.begin());

std::wstring longWord(word.begin(), word.end());

不适用于包含多字节字符的string。 要在Windows上正确地从多字节字符string转换为wstring,您可以使用mbstowcs():http://www.cplusplus.com/reference/cstdlib/mbstowcs/

以独立于平台的方式,使用C ++ 11(clang的编译选项:-std=c++1),您可以执行此操作:https://stackoverflow.com/a/14809553/1915854https://stackoverflow.com/a/18597384/1915854

示例如果您需要超出单个wchar_t可以存储的字符:

std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::wstring longWord = converter.from_bytes(word);

如果您不需要超出单个wchar_t可以存储的字符:

std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
std::wstring longWord = converter.from_bytes(word);

必要包括:

#include <locale>
#include <codecvt>
#include <string>

在Boost中,C ++ 11之前似乎有其他选择。