windows与linux通讯乱码,c++ windows与linux通信中文乱码问题解决方法

在linux中默认编码方式是UTF-8,在Windows下默认编码方式时GB2312。因此,在Windows和Linux进行通信的时候,如果没有进行转码则会出现乱码问题。因此,需要进行UTF-8和GB2312之间的转码。下面是转码函数及其相应的函数讲解。

char* U2G(const char* utf8)

{

int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);

wchar_t* wstr = new wchar_t[len+1];

memset(wstr, 0, len+1);

MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);

len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);

char* str = new char[len+1];

memset(str, 0, len+1);

WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len, NULL, NULL);

if(wstr) delete[] wstr;

return str;

}

//GB2312到UTF-8的转换

char* G2U(const char* gb2312)

{

int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);

wchar_t* wstr = new wchar_t[len+1];

memset(wstr, 0, len+1);

MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);

len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);

char* str = new char[len+1];

memset(str, 0, len+1);

WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);

if(wstr) delete[] wstr;

return str;

}

在这两个转码函数中,使用了两个多字节与宽字节之间进行转码的函数。对这两个函数的讲解如下:

函数简单介绍

需要的头文件:Windows.h,wchar_t类型所需头文件wchar.h

( 1 ) MultiByteToWideChar()

函数功能:该函数将一个多字节字符串转换为到一个宽字符(unicode)的字符串

函数原型:

int MultiByteToWideChar(

UINT CodePage,

DWORD dwFlags,

LPCSTR lpMultiByteStr,

int cchMultiByte,

LPWSTR lpWideCharStr,

int cchWideChar

);

参数:

1> CodePage:被转换的多字节字符串所使用的字符集

这个参数可以为系统已安装或有效的任何字符集所给定的值。你也可以指定其为下面的任意一值:

Value        Description

CP_ACP         ANSI code page

CP_MACCP     Not supported

CP_OEMCP     OEM code page

CP_SYMBOL     Not supported

CP_THREAD_ACP     Not supported

CP_UTF7     UTF-7 code page

CP_UTF8     UTF-8 code page

2> dwFlags:用不上,取0

3> lpMultiByteStr:被转换的多字节字符串。

4> cchMultiByte:参数lpMultiByteStr所占字节数。可以设置为-1,会自动判断lpMultiByteStr指定的字符串的长度(如果字符串不是以空字符中止,设置为-1可能失败,可能成功),此参数设置为0函数将失败。

5> lpWideCharStr:目标字符串

6> cchWideChar:参数lpWideCharStr指向的宽字节字符串所占数。若此值为0,函数不会执行转换,而是返回多字节字符串转换为宽字节字符串所需字节数

返回值:

如果函数运行成功,并且cchWideChar不为0,返回值是由lpWideCharStr指向的缓冲区中写入的宽字符数;

如果函数运行成功,并且cchMultiByte为0,返回值是待转换字符串的缓冲区所需求的宽字符数大小。(此种情况用来获取转换所需的wchar_t的个数)

如果函数运行失败,返回值为零。

若想获得更多错误信息,请调用GetLastError()函数。它可以返回下面所列错误代码:

ERROR_INSUFFICIENT_BUFFER;     ERROR_INVALID_FLAGS;

ERROR_INVALID_PARAMETER;         ERROR_NO_UNICODE_TRANSLATION。

( 2 ) WideCharToMultiByte()

函数功能:该函数将一个unicode字符串转换为一个多字节字符串。

函数原型:

int WideCharToMultiByte(

UINT CodePage,

DWORD dwFlags,

LPCWSTR lpWideCharStr,

int cchWideChar,

LPSTR lpMultiByteStr,

int cchMultiByte,

LPCSTR lpDefaultChar,

LPBOOL pfUsedDefaultChar

);

参数:

与MultiByteToWideChar()函数中的参数类似,但是多了两个参数:

lpDefaultChar和pfUsedDefaultChar:只有当WideCharToMultiByte函数遇到一个宽字节字符,而该字符在uCodePage参数标识的代码页中并没有它的表示法时,WideCharToMultiByte函数才使用这两个参数。(通常都取值为NULL)

1> 如果宽字节字符不能被转换,该函数便使用lpDefaultChar参数指向的字符。如果该参数是NULL(这是大多数情况下的参数值),那么该函数使用系统的默认字符。该默认字符通常是个问号。这对于文件名来说是危险的,因为问号是个通配符。

2> pfUsedDefaultChar参数指向一个布尔变量,如果Unicode字符串中至少有一个字符不能转换成等价多字节字符,那么函数就将该变量置为TRUE。如果所有字符均被成功地转换,那么该函数就将该变量置为FALSE。当函数返回以便检查宽字节字符串是否被成功地转换后,可以测试该变量。

返回值:

如果函数运行成功,并且cchMultiByte不为零,返回值是由 lpMultiByteStr指向的缓冲区中写入的字节数;

如果函数运行成功,并且cchMultiByte为零,返回值是接收到待转换字符串的缓冲区所必需的字节数。(此种情况用来获取转换所需Char的个数)

如果函数运行失败,返回值为零。

若想获得更多错误信息,请调用GetLastError函数。它可以返回下面所列错误代码:

ERROR_INSUFFICIENT_BJFFER;ERROR_INVALID_FLAGS;

ERROR_INVALID_PARAMETER;ERROR_NO_UNICODE_TRANSLATION。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值