四联光电智能照明论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3245|回复: 0
打印 上一主题 下一主题

多字节,UTF-8,Unicode相互之间的转换

[复制链接]
  • TA的每日心情
    郁闷
    2016-1-18 09:58
  • 7

    主题

    30

    帖子

    326

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    326
    跳转到指定楼层
    楼主
    发表于 2015-11-16 16:39:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 魔幻使者Jack 于 2015-11-16 16:56 编辑

    以前收集的,很实用的东西,多字节,UTF-8,Unicode相互之间的转换函数:
    1. // 多字节编码转为UTF8编码  
    2. bool MBToUTF8(vector<char>& pu8, const char* pmb, int32 mLen)  
    3. {  
    4. // convert an MBCS string to widechar   
    5. int32 nLen = MultiByteToWideChar(CP_ACP, 0, pmb, mLen, NULL, 0);  
    6.    
    7. WCHAR* lpszW = NULL;  
    8. try  
    9. {  
    10.     lpszW = new WCHAR[nLen];  
    11. }  
    12. catch(bad_alloc &memExp)  
    13. {  
    14.     return false;  
    15. }  
    16.   
    17. int32 nRtn = MultiByteToWideChar(CP_ACP, 0, pmb, mLen, lpszW, nLen);  
    18.    
    19. if(nRtn != nLen)  
    20. {  
    21.     delete[] lpszW;  
    22.     return false;  
    23. }  
    24. // convert an widechar string to utf8  
    25. int32 utf8Len = WideCharToMultiByte(CP_UTF8, 0, lpszW, nLen, NULL, 0, NULL, NULL);  
    26. if (utf8Len <= 0)  
    27. {  
    28.      return false;  
    29. }  
    30. pu8.resize(utf8Len);  
    31. nRtn = WideCharToMultiByte(CP_UTF8, 0, lpszW, nLen, &*pu8.begin(), utf8Len, NULL, NULL);  
    32. delete[] lpszW;  
    33.   
    34. if (nRtn != utf8Len)  
    35. {  
    36.      pu8.clear();  
    37.      return false;  
    38. }  
    39. return true;  
    40. }  
    41.   
    42. // UTF8编码转为多字节编码  
    43. bool UTF8ToMB(vector<char>& pmb, const char* pu8, int32 utf8Len)  
    44. {  
    45.     // convert an UTF8 string to widechar   
    46.     int32 nLen = MultiByteToWideChar(CP_UTF8, 0, pu8, utf8Len, NULL, 0);  
    47.   
    48.     WCHAR* lpszW = NULL;  
    49.     try  
    50.     {  
    51.         lpszW = new WCHAR[nLen];  
    52.     }  
    53.     catch(bad_alloc &memExp)  
    54.     {  
    55.         return false;  
    56.     }  
    57.   
    58.     int32 nRtn = MultiByteToWideChar(CP_UTF8, 0, pu8, utf8Len, lpszW, nLen);  
    59.   
    60.     if(nRtn != nLen)  
    61.     {  
    62.         delete[] lpszW;  
    63.         return false;  
    64.     }  
    65.   
    66.     // convert an widechar string to Multibyte   
    67.     int32 MBLen = WideCharToMultiByte(CP_ACP, 0, lpszW, nLen, NULL, 0, NULL, NULL);  
    68.     if (MBLen <=0)  
    69.     {  
    70.         return false;  
    71.     }  
    72.     pmb.resize(MBLen);  
    73.     nRtn = WideCharToMultiByte(CP_ACP, 0, lpszW, nLen, &*pmb.begin(), MBLen, NULL, NULL);  
    74.     delete[] lpszW;  
    75.   
    76.     if(nRtn != MBLen)  
    77.     {  
    78.         pmb.clear();  
    79.         return false;  
    80.     }  
    81.     return true;  
    82. }  
    83.   
    84. // 多字节编码转为Unicode编码  
    85. bool MBToUnicode(vector<wchar_t>& pun, const char* pmb, int32 mLen)  
    86. {  
    87.     // convert an MBCS string to widechar   
    88.     int32 uLen = MultiByteToWideChar(CP_ACP, 0, pmb, mLen, NULL, 0);  
    89.   
    90.     if (uLen<=0)  
    91.     {  
    92.         return false;  
    93.     }  
    94.     pun.resize(uLen);  
    95.   
    96.     int32 nRtn = MultiByteToWideChar(CP_ACP, 0, pmb, mLen, &*pun.begin(), uLen);  
    97.   
    98.     if (nRtn != uLen)  
    99.     {  
    100.         pun.clear();  
    101.         return false;  
    102.     }  
    103.     return true;  
    104. }  
    105.   
    106. //Unicode编码转为多字节编码  
    107. bool UnicodeToMB(vector<char>& pmb, const wchar_t* pun, int32 uLen)  
    108. {  
    109.     // convert an widechar string to Multibyte   
    110.     int32 MBLen = WideCharToMultiByte(CP_ACP, 0, pun, uLen, NULL, 0, NULL, NULL);  
    111.     if (MBLen <=0)  
    112.     {  
    113.         return false;  
    114.     }  
    115.     pmb.resize(MBLen);  
    116.     int nRtn = WideCharToMultiByte(CP_ACP, 0, pun, uLen, &*pmb.begin(), MBLen, NULL, NULL);  
    117.   
    118.     if(nRtn != MBLen)  
    119.     {  
    120.         pmb.clear();  
    121.         return false;  
    122.     }  
    123.     return true;  
    124. }  
    125.   
    126. // UTF8编码转为Unicode  
    127. bool UTF8ToUnicode(vector<wchar_t>& pun, const char* pu8, int32 utf8Len)  
    128. {  
    129.     // convert an UTF8 string to widechar   
    130.     int32 nLen = MultiByteToWideChar(CP_UTF8, 0, pu8, utf8Len, NULL, 0);  
    131.     if (nLen <=0)  
    132.     {  
    133.         return false;  
    134.     }  
    135.     pun.resize(nLen);  
    136.     int32 nRtn = MultiByteToWideChar(CP_UTF8, 0, pu8, utf8Len, &*pun.begin(), nLen);  
    137.   
    138.     if(nRtn != nLen)  
    139.     {  
    140.         pun.clear();  
    141.         return false;  
    142.     }  
    143.   
    144.     return true;  
    145. }  
    146.   
    147. // Unicode编码转为UTF8  
    148. bool UnicodeToUTF8(vector<char>& pu8, const wchar_t* pun, int32 uLen)  
    149. {  
    150.     // convert an widechar string to utf8  
    151.     int32 utf8Len = WideCharToMultiByte(CP_UTF8, 0, pun, uLen, NULL, 0, NULL, NULL);  
    152.     if (utf8Len<=0)  
    153.     {  
    154.         return false;  
    155.     }  
    156.     pu8.resize(utf8Len);  
    157.     int32 nRtn = WideCharToMultiByte(CP_UTF8, 0, pun, uLen, &*pu8.begin(), utf8Len, NULL, NULL);  
    158.   
    159.     if (nRtn != utf8Len)  
    160.     {  
    161.         pu8.clear();  
    162.         return false;  
    163.     }  
    164.     return true;  
    165. }
    复制代码




    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Silian Lighting+ ( 蜀ICP备14004521号-1 )

    GMT+8, 2024-4-27 02:52 , Processed in 1.109375 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表