如何比较一根绳子和一根_T("some String")?
How to compare a wstring with a _T("some String")?
我有一个函数wstring A2T(const string& str)
将string
转换为wstring
。但是,当我将返回值与const wstring
进行比较时,我无法获得正确的值。例如,
wstring strOn = A2T("on");
if ( strOn == _T("on"))
{
SetItemSwitch(true);
}
else
{
SetItemSwitch(false);
}
if(strOn == _T("on"))
语句总是false。我的代码有什么问题?
这是A2T
:
std::wstring A2T(const string& str)
{
if (str.empty()) return std::wstring();
int sz = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, 0, 0);
std::wstring res(sz, 0);
MultiByteToWideChar(CP_UTF8, 0, &str[0], -1, &res[0], sz);
return res;
}
问题在于对第一次调用MultiByteToWideChar
的返回值的解释(或使用)-它将返回缓冲区所需的大小,包括终止NULL
字符。当创建宽字符串时,NULL
的计数应该从大小中删除,字符串将在内部添加。
另外,在第二次调用时,使用字符串的实际大小;这是为了避免MultiByteToWideChar
处理包含任何终止NULL
字符的缓冲区(它们的存在已经在字符串大小计算中得到了满足)。同样,字符串将在内部管理NULL
。
std::wstring A2T(const std::string& str)
{
if (str.empty())
return std::wstring();
int sz = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, 0, 0);
std::wstring res(sz - 1, 0);
// ^^^ count to "remove" the NULL
MultiByteToWideChar(CP_UTF8, 0, &str[0], str.size(), &res[0], res.size());
// ^^^ use actual sizes
return res;
}
根据所使用的编译器的版本,您还可以调查res.data()
使用std::basic_string::data
而不是&res[0]
。
相关文章:
- 如何遍历几个每小时一次的根(.root)文件,并将它们组合成更大的每日数据.root文件?
- 比较字符串的 GetLine 工作一次,然后比较之后不起作用
- Av_read_pause和av_read_play挂了一根线
- 如何将向量一的所有元素与向量二进行比较,如果存在最大元素,则将向量二的所有元素与向量三进行比较?
- 将 32 位浮点数和不强制转换的 32 位整数与双精度进行比较,当其中一个值可能太大而无法完全适合另一种类型时
- 使用增强灵气解析一根细弦
- 按列对CSV文件进行排序,并与C 中的另一列进行比较
- 如何最好地重载运算符 < > <= >= 但只写一两个比较函数?
- C 求解四分之一根(第四阶多项式)
- 如何在c++骰子游戏中存储第一个值,并在下一步进行比较
- 我可以用另一根线冲洗我的蒸汽吗
- 在执行过程中睡一根线
- 在一根奇怪的绳子上排列
- ".exe has stopped working"当我尝试串起一根绳子时
- 投掷和抓住一根绳子
- 有可能弄断一根纺线吗?
- 一种涉及比较函子的循环依赖关系
- 如何比较一根绳子和一根_T("some String")?
- 为什么我不能做一根绳子
- 如何从一组中取出一根弦