首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何正确使用WideCharToMultiByte

如何正确使用WideCharToMultiByte
EN

Stack Overflow用户
提问于 2008-10-19 03:33:20
回答 3查看 140.8K关注 0票数 77

我已经阅读了关于WideCharToMultiByte的文档,但是我被这个参数卡住了:

代码语言:javascript
复制
lpMultiByteStr
[out] Pointer to a buffer that receives the converted string.

我不太确定如何正确地初始化变量并将其提供给函数

EN

回答 3

Stack Overflow用户

发布于 2010-10-23 01:59:31

下面是几个函数(基于Brian Bondy的示例),它们使用WideCharToMultiByte和MultiByteToWideChar在std::wstring和std::string之间进行转换,使用utf8不会丢失任何数据。

代码语言:javascript
复制
// Convert a wide Unicode string to an UTF8 string
std::string utf8_encode(const std::wstring &wstr)
{
    if( wstr.empty() ) return std::string();
    int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL);
    std::string strTo( size_needed, 0 );
    WideCharToMultiByte                  (CP_UTF8, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL);
    return strTo;
}

// Convert an UTF8 string to a wide Unicode String
std::wstring utf8_decode(const std::string &str)
{
    if( str.empty() ) return std::wstring();
    int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0);
    std::wstring wstrTo( size_needed, 0 );
    MultiByteToWideChar                  (CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed);
    return wstrTo;
}
票数 144
EN

Stack Overflow用户

发布于 2008-10-19 19:52:01

详细介绍Brian R.Bondy提供的answer:下面是一个示例,它说明了为什么不能简单地根据源字符串中的宽字符数来调整输出缓冲区的大小:

代码语言:javascript
复制
#include <windows.h>
#include <stdio.h>
#include <wchar.h>
#include <string.h>

/* string consisting of several Asian characters */
wchar_t wcsString[] = L"\u9580\u961c\u9640\u963f\u963b\u9644";

int main() 
{

    size_t wcsChars = wcslen( wcsString);

    size_t sizeRequired = WideCharToMultiByte( 950, 0, wcsString, -1, 
                                               NULL, 0,  NULL, NULL);

    printf( "Wide chars in wcsString: %u\n", wcsChars);
    printf( "Bytes required for CP950 encoding (excluding NUL terminator): %u\n",
             sizeRequired-1);

    sizeRequired = WideCharToMultiByte( CP_UTF8, 0, wcsString, -1,
                                        NULL, 0,  NULL, NULL);
    printf( "Bytes required for UTF8 encoding (excluding NUL terminator): %u\n",
             sizeRequired-1);
}

和输出:

代码语言:javascript
复制
Wide chars in wcsString: 6
Bytes required for CP950 encoding (excluding NUL terminator): 12
Bytes required for UTF8 encoding (excluding NUL terminator): 18
票数 37
EN

Stack Overflow用户

发布于 2008-10-19 03:41:27

您可以通过创建一个新的字符数组来使用lpMultiByteStr输出参数。然后传递这个char数组来填充它。您只需要初始化字符串+1的长度,这样在转换后您就可以拥有一个以null结尾的字符串。

这里有几个有用的助手函数,它们显示了所有参数的用法。

代码语言:javascript
复制
#include <string>

std::string wstrtostr(const std::wstring &wstr)
{
    // Convert a Unicode string to an ASCII string
    std::string strTo;
    char *szTo = new char[wstr.length() + 1];
    szTo[wstr.size()] = '\0';
    WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, szTo, (int)wstr.length(), NULL, NULL);
    strTo = szTo;
    delete[] szTo;
    return strTo;
}

std::wstring strtowstr(const std::string &str)
{
    // Convert an ASCII string to a Unicode String
    std::wstring wstrTo;
    wchar_t *wszTo = new wchar_t[str.length() + 1];
    wszTo[str.size()] = L'\0';
    MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, wszTo, (int)str.length());
    wstrTo = wszTo;
    delete[] wszTo;
    return wstrTo;
}

--

在文档中的任何时候,当你看到它有一个指向类型的指针的参数,并且他们告诉你它是一个out变量时,你会想要创建那个类型,然后传递一个指向它的指针。该函数将使用该指针填充您的变量。

因此您可以更好地理解这一点:

代码语言:javascript
复制
//pX is an out parameter, it fills your variable with 10.
void fillXWith10(int *pX)
{
  *pX = 10;
}

int main(int argc, char ** argv)
{
  int X;
  fillXWith10(&X);
  return 0;
}
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/215963

复制
相关文章

相似问题

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