【问题标题】:Convert const char* to const wchar_t*将 const char* 转换为 const wchar_t*
【发布时间】:2015-08-05 05:21:33
【问题描述】:

我正在尝试使用 Irrlicht 创建一个程序,该程序从用 Lua 编写的配置文件中加载某些内容,其中之一是窗口标题。但是,lua_tostring 函数返回 const char*,而 Irrlicht 设备的方法 setWindowCaption 需要 const wchar_t*。如何转换lua_tostring返回的字符串?

【问题讨论】:

    标签: c++ type-conversion irrlicht


    【解决方案1】:

    有多个关于 SO 的问题可以解决 Windows 上的问题。示例帖子:

    1. char* to const wchar_t * conversion
    2. conversion from unsigned char* to const wchar_t*

    http://ubuntuforums.org/showthread.php?t=1579640 发布了一个与平台无关的方法。本站出处是(希望没有侵犯版权):

    #include <locale>
    #include <iostream>
    #include <string>
    #include <sstream>
    using namespace std ;
    
    wstring widen( const string& str )
    {
        wostringstream wstm ;
        const ctype<wchar_t>& ctfacet = use_facet<ctype<wchar_t>>(wstm.getloc()) ;
        for( size_t i=0 ; i<str.size() ; ++i ) 
                  wstm << ctfacet.widen( str[i] ) ;
        return wstm.str() ;
    }
    
    string narrow( const wstring& str )
    {
        ostringstream stm ;
    
        // Incorrect code from the link
        // const ctype<char>& ctfacet = use_facet<ctype<char>>(stm.getloc());
    
        // Correct code.
        const ctype<wchar_t>& ctfacet = use_facet<ctype<wchar_t>>(stm.getloc());
    
        for( size_t i=0 ; i<str.size() ; ++i ) 
                      stm << ctfacet.narrow( str[i], 0 ) ;
        return stm.str() ;
    }
    
    int main()
    {
      {
        const char* cstr = "abcdefghijkl" ;
        const wchar_t* wcstr = widen(cstr).c_str() ;
        wcout << wcstr << L'\n' ;
      }
      {  
        const wchar_t* wcstr = L"mnopqrstuvwx" ;
        const char* cstr = narrow(wcstr).c_str() ;
        cout << cstr << '\n' ;
      } 
    }
    

    【讨论】:

    • 一般来说,我发现在 Ubuntu 中处理 C++ 中的宽文本需要设置默认语言环境。实现的行为方式非常具有讽刺意味。对于 UTF-8 和 Unix-land 来说,语言环境对于窄范围转换几乎不重要,但必须设置,而对于各种单字节编码(如 Windows),语言环境非常重要,但默认情况下已经设置。跨度>
    【解决方案2】:

    你可以使用mbstowcs:

        wchar_t WBuf[100];
        mbstowcs(WBuf,lua_tostring( /*...*/ ),99);
    

    或更安全:

        const char* sz = lua_tostring(/*...*/);
        std::vector<wchar_t> vec;
        size_t len = strlen(sz);
        vec.resize(len+1);
        mbstowcs(&vec[0],sz,len);
        const wchar_t* wsz = &vec[0];
    

    【讨论】:

      【解决方案3】:

      对于 Unicode:

      std::string myString = "Master James";
      const char* sz = myString.c_str();
      size_t origsizes = strlen(sz) + 1;
      const size_t newsizes = 500;
      size_t convertedCharP = 0;
      wchar_t constTowchar[500];
      mbstowcs_s(&convertedCharP, constTowchar, origsizes, sz, _TRUNCATE);
      std::wcout << constTowchar << std::endl;
      

      这正在使用mbstowcs_s

      【讨论】:

        【解决方案4】:

        这是第一个答案中代码的更快版本,不要忘记 std::locale::global(std::locale(""));对于某些字符

        #include <xlocale>
        #include <sstream>
        
        [[nodiscard]] inline std::wstring widen(const char* str)
        {
            const auto length = strlen(str);
        
            std::wstring result;
            result.resize(length);
        
            const auto& facet = use_facet<std::ctype<wchar_t>>(std::wostringstream().getloc());
            std::transform(str, str + length, result.begin(), [&facet](const char ch)
            {
                return facet.widen(ch);
            });
            return result;
        }
        
        [[nodiscard]] inline std::string narrow(const wchar_t* str)
        {
            const auto length = wcslen(str);
        
            std::string result;
            result.resize(length);
        
            const auto& facet = use_facet<std::ctype<wchar_t>>(std::ostringstream().getloc());
            std::transform(str, str + length, result.begin(), [&facet](const wchar_t ch)
            {
                return facet.narrow(ch);
            });
            return result;
        }
        

        【讨论】:

        • 虽然您的答案可能会回答问题,但不接受“仅代码”的答案。请为正在发生的事情添加标题和一些解释。 stackoverflow.com/help/how-to-answer 了解更多信息。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-31
        • 2011-12-11
        • 2012-08-04
        • 1970-01-01
        • 2013-08-11
        • 2011-12-27
        相关资源
        最近更新 更多