利用wcstombs将中文wchar_t转换为char,模拟WideCharToMultiByte
我们都知道Windows Api中有WideCharToMultiByte和MultiByteToWideChar函数,可以实现中文在宽字节与多字节的转换,那么在Linux平台下怎么办呢?我们可以同过函数wcstomb实现,看例子:
代码块
对于中文要通过setlocal,要先设置语系,例如:
#include "stdafx.h"
#include <string.h>
#include <locale.h>
#include <stdlib.h>
void testConvert();
int _tmain(int argc, _TCHAR* argv[])
{
testConvert();
system("pause");
return 0;
}
void testConvert()
{
// 保存原来的语系
char* old_locale = _strdup(setlocale(LC_CTYPE, NULL)); //store the old locale
// 设置新的语系
setlocale(LC_CTYPE, setlocale(LC_ALL, "")); //using the locale of the user env.
int maxNum = 20;
int i = 0;
wchar_t *pwchello = L"今天是好天气";
wprintf(L"\tBefore convert wide-character string:%s\n", pwchello);
char *pmbbuf = (char *)malloc(maxNum);
memset(pmbbuf, 0, maxNum);
int relLen = wcslen(pwchello);
printf("\tText length: %d\n", relLen);
// 注意Visual studio高版本中产生error C4996: 'wcstombs'Consider using wcstombs_s instead
// 你可以改为wcstombs_s,按照其参数设置就行了
// 也可以定义宏_CRT_SECURE_NO_WARNINGS在stdafx.h所有头文件包含之前,定义#define _CRT_SECURE_NO_WARNINGS
i = wcstombs(pmbbuf, pwchello, relLen *2); // 窄字符数变成2倍了
printf("\tAfter Characters converted: %u\n", i);
printf("\tMultibyte character: %s\n\n", pmbbuf);
free(pmbbuf);
// 还原语系
//restore the old locale.
setlocale(LC_CTYPE, old_locale);
free(old_locale);
}
示例中有注释,提醒您,对于中文必须要设置setlocal,英文不需要
还有VS高版本会出现警告或错误错误 error C4996: ‘wcstombs’: This function or variable may be unsafe. Consider using wcstombs_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. d:\documents\visual studio 2013\projects\myconsoletest\myconsoletest\myconsoletest.cpp 32 1 MyConsoleTest
参考个问题的解决方案如下:
方法一:将原来的旧函数替换成新的 wcstombs_s ;
方法二:用以下任意一个方法屏蔽这个警告:
1. 在预编译头文件stdafx.h里(注意:一定要在没有include任何头文件之前)定义下面的宏:
#define _CRT_SECURE_NO_DEPRECATE
2. 或声明 #param warning(disable:4996)
3. 更改预处理定义:
项目->属性->配置属性->C/C++ -> 预处理器 -> 预处理器定义,增加:
_CRT_SECURE_NO_DEPRECATE