1

我知道编码,并且输入字符串是 100% 单字节,没有像 utf 等花哨的编码。我想要的只是根据已知的编码将它转换为 wchar_t* 或 wstring。使用什么功能?btowc()然后循环?也许字符串对象有一些有用的东西。有很多示例,但所有示例都是针对“多字节”或带有 btowc() 的花哨循环,它们仅显示如何在屏幕上显示确实此功能正在工作的输出,我还没有看到任何严肃的示例如何处理这样的缓冲区情况下,宽字符总是比单个字符字符串大 2 倍吗?

4

1 回答 1

3

试试这个模板。它对我很有帮助。

(作者不详)

/* string2wstring.h */
#pragma once

 #include <string>
#include <vector>
#include <locale>
#include <functional>
#include <iostream>

 // Put this class in your personal toolbox...
 template<class E,
 class T = std::char_traits<E>,
 class A = std::allocator<E> >

 class Widen : public std::unary_function<
     const std::string&, std::basic_string<E, T, A> >
 {
     std::locale loc_;
     const std::ctype<E>* pCType_;

     // No copy-constructor, no assignment operator...
     Widen(const Widen&);
     Widen& operator= (const Widen&);

 public:
     // Constructor...
     Widen(const std::locale& loc = std::locale()) : loc_(loc)
     {
#if defined(_MSC_VER) && (_MSC_VER < 1300) // VC++ 6.0...
         using namespace std;
         pCType_ = &_USE(loc, ctype<E> );
#else
         pCType_ = &std::use_facet<std::ctype<E> >(loc);
#endif
     }

     // Conversion...
     std::basic_string<E, T, A> operator() (const std::string& str) const
     {
         typename std::basic_string<E, T, A>::size_type srcLen =
             str.length();
         const char* pSrcBeg = str.c_str();
         std::vector<E> tmp(srcLen);

         pCType_->widen(pSrcBeg, pSrcBeg + srcLen, &tmp[0]);
         return std::basic_string<E, T, A>(&tmp[0], srcLen);
     }
 };

 // How to use it...
 int main()
 {
 Widen<wchar_t> to_wstring;
 std::string s = "my test string";
 std::wstring w = to_wstring(s);
 std::wcout << w << L"\n";
 }
于 2012-12-15T16:43:47.020 回答