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。

posted @ 2018-01-23 19:50  夜雨翛然  阅读(3343)  评论(0编辑  收藏  举报