我有一个单词流,在循环的每次运行中都给我一个单词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"
。
知道我应该怎么做才能解决这个问题?
答案 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/1915854,https://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之前似乎有其他选择。