利用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
Logo

更多推荐