zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    面向对象三大特性?
    final finally finalize区别?
    LeetCode122-买卖股票的最佳时机2(贪心算法)
    LeetCode119-杨辉三角2(题目有Bug,动态规划)
    九度OJ 1051:数字阶梯求和 (大数运算)
    九度OJ 1050:完数 (数字特性)
    九度OJ 1049:字符串去特定字符 (基础题)
    九度OJ 1048:判断三角形类型 (基础题)
    九度OJ 1047:素数判定 (素数)
    九度OJ 1046:求最大值 (基础题)
  • 原文地址:https://www.cnblogs.com/HPAHPA/p/8337575.html
Copyright © 2011-2022 走看看