系统在英文状态下调用 MultiByteToWideChar 中文乱码问题

本文详细介绍了在不同系统环境下进行字符编码转换的方法,特别是在中文和英文系统间使用MultiByteToWideChar和WideCharToMultiByte函数时遇到的问题及解决办法。通过指定正确的代码页如936(简体中文),确保了字符能够正确地从一种编码转换到另一种编码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.在正常的中文系统下执行MultiByteToWideChar很正常,其中,第一个参数为:CP_ACP

2.在英文系统下执行MultiByteToWideChar,取得的字符编码全部变成了3F,后将"CP_ACP"替换为936,就正常显示了。


主要是WideCharToMultiByte的第一个参数codepage造成的,如前面所使用的CP_ACP所表达的意思是使用系统字符集转换,但是由于此时的系统字符集为英文,在这个codepage中并没有中文,所以转换出错。

维基百科上面是这样解释codepage 936的:936为Microsoft's character encoding for simplified Chinese。

#define MY_CONV_CODE_PAGE      936

wchar_t * ANSIToUnicode( const char* str )
{
       int textlen ;
       wchar_t * result;
       textlen = MultiByteToWideChar( MY_CONV_CODE_PAGE, 0, str,-1, NULL,0 );
       result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t));
       memset(result,0,(textlen+1)*sizeof(wchar_t));
       MultiByteToWideChar(MY_CONV_CODE_PAGE, 0,str,-1,(LPWSTR)result,textlen );
       return result;
}

char * UnicodeToANSI( const wchar_t* str )
{
       char* result;
       int textlen;
       textlen = WideCharToMultiByte( MY_CONV_CODE_PAGE, 0, str, -1, NULL, 0, NULL, NULL );
       result =(char *)malloc((textlen+1)*sizeof(char));
       memset( result, 0, sizeof(char) * ( textlen + 1 ) );
       WideCharToMultiByte( MY_CONV_CODE_PAGE, 0, str, -1, result, textlen, NULL, NULL );
       return result;
}

wchar_t * UTF8ToUnicode( const char* str )
{
       int textlen ;
       wchar_t * result;
       textlen = MultiByteToWideChar( CP_UTF8, 0, str,-1, NULL,0 );
       result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t));
       memset(result,0,(textlen+1)*sizeof(wchar_t));
       MultiByteToWideChar(CP_UTF8, 0,str,-1,(LPWSTR)result,textlen );
       return result;
}

char * UnicodeToUTF8( const wchar_t* str )
{
       char* result;
       int textlen;
       textlen = WideCharToMultiByte( CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL );
       result =(char *)malloc((textlen+1)*sizeof(char));
       memset(result, 0, sizeof(char) * ( textlen + 1 ) );
       WideCharToMultiByte( CP_UTF8, 0, str, -1, result, textlen, NULL, NULL );
       return result;
}
/*宽字符转换为多字符Unicode - ANSI*/
char* w2m(const wchar_t* wcs)
{
       int len;
       char* buf;
       len = wcstombs(NULL,wcs,0);
       if (len == 0)
                return NULL;
       buf = (char *)malloc(sizeof(char)*(len+1));
       memset(buf, 0, sizeof(char) *(len+1));
       len =wcstombs(buf,wcs,len+1);
       return buf;
}
/*多字符转换为宽字符ANSI - Unicode*/
wchar_t* m2w(const char* mbs)
{
       int len;
       wchar_t* buf;
       len =mbstowcs(NULL,mbs,0);
       if (len == 0)
                return NULL;
       buf = (wchar_t *)malloc(sizeof(wchar_t)*(len+1));
       memset(buf, 0, sizeof(wchar_t) *(len+1));
       len =mbstowcs(buf,mbs,len+1);
       return buf;
}

char* ANSIToUTF8(const char* str)
{
       return UnicodeToUTF8(ANSIToUnicode(str));
}

char* UTF8ToANSI(const char* str)
{
       return UnicodeToANSI(UTF8ToUnicode(str));
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值