【发布时间】: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)是有损操作。
-
使用 WideCharToMultiByte 函数:docs.microsoft.com/en-us/windows/win32/api/stringapiset/…
-
@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)。当然,该程序不能在其他平台上移植。