首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等价的wstring操作?

等价的wstring操作?
EN

Stack Overflow用户
提问于 2021-01-10 04:37:59
回答 1查看 58关注 0票数 0

我正在尝试执行相同的操作,但使用的是与visual c++ 2010兼容的代码:

代码语言:javascript
复制
wstring widen(string Str) {
    const size_t wcharCount = Str.size() + 1;
    vector<wchar_t> Buffer(wcharCount);

    return wstring{
        Buffer.data(),(size_t)MultiByteToWideChar(CP_UTF8, 0, Str.c_str(), -1, Buffer.data(), (int)wcharCount);
    };
}

具体地说:

代码语言:javascript
复制
return wstring{
    Buffer.data(),(size_t)MultiByteToWideChar(CP_UTF8, 0, Str.c_str(), -1, Buffer.data(), (int)wcharCount);
};

我如何返回wstring,但用另一种方式...因为我得到了错误,因为我必须使用的编译器是旧的。

我还想了解更多关于转换代码的知识,与旧版本的Microsoft visual c++兼容(在这里,我想在2010版本中编译它(我已经有了))。

EDIT:作为跟踪错误的有用工具:

第5行|错误C2143:语法错误:‘{’前缺少';‘

第5行|错误C2275:'std::wstring‘:该类型被非法用作表达式

EN

回答 1

Stack Overflow用户

发布于 2021-01-10 05:28:33

对于较旧的(C++11之前的)编译器,请使用括号(return wstring(...))而不是大括号(return wstring{...}),并使用std::vector::operator[]来访问分配的数组,而不是std::vector::data() (当时还不存在),例如:

代码语言:javascript
复制
return wstring(
    &Buffer[0], MultiByteToWideChar(CP_UTF8, 0, Str.c_str(), -1, &Buffer[0], wcharCount)
);

也就是说,用于std::vector的源std::string的大小是错误的。调用MultiByteToWideChar()两次-使用空输出缓冲区调用它一次,以计算必要的大小,然后再次调用它以写入缓冲区。而且,您应该使用std::string的实际大小,而不是源缓冲区大小的-1。

代码语言:javascript
复制
wstring widen(const string &Str) {
    const int wcharCount = MultiByteToWideChar(CP_UTF8, 0, Str.c_str(), Str.size(), NULL, 0);
    vector<wchar_t> Buffer(wcharCount);
    return wstring(
        &Buffer[0], MultiByteToWideChar(CP_UTF8, 0, Str.c_str(), Str.size(), &Buffer[0], wcharCount)
    );
}

请注意,在C++11和更高版本中,直接使用预先调整大小的std::wstring作为目标缓冲区是安全的,您根本不需要std::vector,因为std::wstring保证使用单个连续的内存块来存储其字符数据。即使在早期的编译器中,这在实践中通常也是安全的(尽管不能保证),因为大多数实现都使用连续的块来提高效率:

代码语言:javascript
复制
wstring widen(const string &Str) {
    const int wcharCount = MultiByteToWideChar(CP_UTF8, 0, Str.c_str(), Str.size(), NULL, 0);
    wstring Buffer;
    if (wcharCount > 0) {
        Buffer.resize(wcharCount);
        MultiByteToWideChar(CP_UTF8, 0, Str.c_str(), Str.size(), &Buffer[0]/* or Buffer.data() in C++17 */, wcharCount);
    }
    return Buffer;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65647364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档