如何在c ++中将单字节字符串转换为宽字符串?

时间:2012-12-15 14:19:45

标签: c++ string winapi widestring

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

1 个答案:

答案 0 :(得分:2)

试试这个template。它非常适合我。

(作者不详)

/* 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";
 }