【问题标题】:Cannot convert a wide character string to a multibyte character string无法将宽字符串转换为多字节字符串
【发布时间】:2021-08-23 17:58:49
【问题描述】:

我想将宽字符串转换为多字节字符串。

以下程序给我一个错误:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#define BUFFER_SIZE 100

int main( void )
{
    size_t   i;
    char      *pMBBuffer = (char *)malloc( BUFFER_SIZE );
    wchar_t*pWCBuffer = L"Hello, world.";

    printf( "Convert wide-character string:\n" );

    // Conversion
    wcstombs_s(&i, pMBBuffer, (size_t)BUFFER_SIZE,
               pWCBuffer, (size_t)BUFFER_SIZE );

    // Output
    printf("   Characters converted: %u\n", i);
    printf("    Multibyte character: %s\n\n",
     pMBBuffer );

    // Free multibyte character buffer
    if (pMBBuffer)
    {
    free(pMBBuffer);
    }
}

我使用 C++11 编译器编译。错误是:

error: ‘wcstombs_s’ was not declared in this scope; did you mean ‘wcstombs’?
   19 |     wcstombs_s(&i, pMBBuffer, (size_t)BUFFER_SIZE,
      |     ^~~~~~~~~~

【问题讨论】:

  • 你用的是什么编译器? wcstombs_s 是 Microsoft 扩展。
  • 现在真正的问题是:为什么要丢弃数据?将(可能)UTF-16 编码文本转换为任何其他编码(不是 UTF-8)是有损操作。
  • @DrewDormann 我使用 g++ -std=c++11 test_wchar_t.c
  • 你用 [winapi] 标签标记了这个问题,WideCharToMultiByte 是一个 Windows API,所以如果你有办法绑定到 Windows API(如果你有 minGW,例如 stackoverflow.com/a/13101384/403671 where MessageBox 是一个 Windows API)。当然,该程序不能在其他平台上移植。

标签: c++ winapi


【解决方案1】:

我将函数 wcstombs_s 修改为 wcstombs 如下: 它工作正常:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#define BUFFER_SIZE 100

int main( void )
{
    size_t   i;
    char      *pMBBuffer = (char *)malloc( BUFFER_SIZE );
    wchar_t*pWCBuffer = L"Hello, world.";

    printf( "Convert wide-character string:\n" );

        wcstombs(pMBBuffer, pWCBuffer, (size_t)BUFFER_SIZE);



    // Output
    printf("    Multibyte character: %s\n\n",
     pMBBuffer );

    // Free multibyte character buffer
    if (pMBBuffer)
    {
    free(pMBBuffer);
    }
}
~  

                                                                                                                                                                                                    

~

【讨论】:

    猜你喜欢
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 2011-10-05
    相关资源
    最近更新 更多