• C++ 字符编码转换类


    记录一下C++ 编码转换的函数:

     1 #pragma once
     2 #include "afx.h"
     3 
     4 
     5 #define DEFAULT_CODE 0
     6 #define CHINESE_SIMPLIFIED 1
     7 #define   CHINESE_TRADITIONAL 2
     8 
     9 class CChineseConvertor:
    10 //public CObject
    11 {
    12 public:
    13     CChineseConvertor(void);
    14     ~CChineseConvertor(void);
    15     LPSTR Big52GBKSimplified(char * szText);
    16     LPSTR Big52GBKTraditional(char * szText);
    17     LPSTR GBK2Big5(char * szText);
    18     LPSTR GBKSimplified2GBKTraditional(char * szSimplified);
    19     LPSTR GBKTraditional2GBKSimplified(char * szTraditional);
    20     LPWSTR UTF82UNICODE(char*   utf8str);
    21     LPSTR UNICODE2UTF8(LPCWSTR  strText);
    22 
    23     char *m_pszUnknown;
    24     // 转换到Unicode
    25     LPWSTR ToUnicode(char * szSource, int nEncoding);
    26     LPSTR ToMultiByte(LPCWSTR szSource, int nEncoding);
    27 };
      1 #include "stdafx.h"
      2 #include "Coding.h"
      3 
      4 
      5  
      6 CChineseConvertor::CChineseConvertor(void)
      7 {
      8   m_pszUnknown = new char[2];
      9   m_pszUnknown[0]=' ';
     10   m_pszUnknown[1]=0;
     11 }
     12 
     13 CChineseConvertor::~CChineseConvertor(void)
     14 {
     15   delete[] m_pszUnknown;
     16   m_pszUnknown = NULL;
     17 }
     18 
     19 //big5 to GBK_简体
     20 LPSTR CChineseConvertor::Big52GBKSimplified(char * szText)
     21 {
     22   int nLength;
     23   wchar_t *pBuffer;
     24   LPSTR pResult;
     25   int nResultLength;
     26 
     27   nLength=MultiByteToWideChar(950,0,szText,strlen(szText),NULL,0);
     28   pBuffer=new wchar_t[nLength+1];
     29   MultiByteToWideChar(950,0,(LPCSTR)szText,strlen(szText),(LPWSTR)pBuffer,nLength);
     30   pBuffer[nLength]=0;
     31 
     32   nResultLength=WideCharToMultiByte(936,0,pBuffer,nLength,NULL,0,m_pszUnknown,FALSE);
     33   pResult=new char[nResultLength+1];
     34   WideCharToMultiByte(936,0,(LPWSTR)pBuffer,nLength,(LPSTR)pResult,nResultLength,"  ",FALSE);
     35   pResult[nResultLength]=0;
     36 
     37   return GBKTraditional2GBKSimplified(pResult);
     38   
     39 }
     40 
     41 //big5 to GBK_繁体
     42 LPSTR CChineseConvertor::Big52GBKTraditional(char * szText)
     43 {
     44   int nLength;
     45   wchar_t *pBuffer;
     46   LPSTR pResult;
     47   int nResultLength;
     48 
     49   nLength=MultiByteToWideChar(950,0,szText,strlen(szText),NULL,0);
     50   pBuffer=new wchar_t[nLength+1];
     51   MultiByteToWideChar(950,0,(LPCSTR)szText,strlen(szText),(LPWSTR)pBuffer,nLength);
     52   pBuffer[nLength]=0;
     53 
     54   nResultLength=WideCharToMultiByte(936,0,pBuffer,nLength,NULL,0,m_pszUnknown,FALSE);
     55   pResult=new char[nResultLength+1];
     56   WideCharToMultiByte(936,0,(LPWSTR)pBuffer,nLength,(LPSTR)pResult,nResultLength,"  ",FALSE);
     57   pResult[nResultLength]=0;
     58 
     59   return pResult;
     60 }
     61 
     62 //GBK_简体 to GBK_繁体
     63 LPSTR CChineseConvertor::GBKTraditional2GBKSimplified(char * szTraditional)
     64 {
     65   LCID dwLocale;
     66   WORD wLangID;
     67   wLangID=MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED);
     68   dwLocale=MAKELCID(wLangID,SORT_CHINESE_PRC);
     69 
     70   int nLength;
     71   char *pBuffer;
     72   nLength=LCMapStringA(dwLocale,LCMAP_SIMPLIFIED_CHINESE,(LPCSTR)szTraditional,strlen(szTraditional),NULL,0);
     73   pBuffer=new char[nLength+1];
     74   pBuffer[nLength]=0;
     75   LCMapStringA(dwLocale,LCMAP_SIMPLIFIED_CHINESE,(LPCSTR)szTraditional,strlen(szTraditional),pBuffer,nLength);
     76   return pBuffer;
     77 }
     78 
     79 //GBK_简体 to big5
     80 LPSTR CChineseConvertor::GBK2Big5(char * szText)
     81 {
     82   LPSTR szGBKTraditional;
     83   int nLength;
     84   wchar_t *pBuffer;
     85   LPSTR pResult;
     86   int nResultLength;
     87 
     88   szGBKTraditional=GBKSimplified2GBKTraditional(szText);
     89   nLength=MultiByteToWideChar(936,0,szGBKTraditional,strlen(szGBKTraditional),NULL,0);
     90   pBuffer=new wchar_t[nLength+1];
     91   MultiByteToWideChar(936,0,(LPCSTR)szGBKTraditional,strlen(szGBKTraditional),(LPWSTR)pBuffer,nLength);
     92   pBuffer[nLength]=0;
     93 
     94   nResultLength=WideCharToMultiByte(950,0,pBuffer,nLength,NULL,0,m_pszUnknown,FALSE);
     95   pResult=new char[nResultLength+1];
     96   WideCharToMultiByte(950,0,(LPWSTR)pBuffer,nLength,(LPSTR)pResult,nResultLength,"  ",FALSE);
     97   pResult[nResultLength]=0;
     98 
     99   return pResult;
    100 }
    101 
    102 //将GBK的简体转换到GBK繁体
    103 LPSTR CChineseConvertor::GBKSimplified2GBKTraditional(char * szSimplified)
    104 {
    105   LCID dwLocale;
    106   WORD wLangID;
    107   wLangID=MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED);
    108   dwLocale=MAKELCID(wLangID,SORT_CHINESE_PRC);
    109 
    110   int nLength;
    111   char *pBuffer;
    112   nLength=LCMapStringA(dwLocale,LCMAP_TRADITIONAL_CHINESE,(LPCSTR)szSimplified,strlen(szSimplified),NULL,0);
    113   pBuffer=new char[nLength+1];
    114   pBuffer[nLength]=0;
    115   LCMapStringA(dwLocale,LCMAP_TRADITIONAL_CHINESE,(LPCSTR)szSimplified,strlen(szSimplified),pBuffer,nLength);
    116   return pBuffer;
    117 }
    118 
    119 // 转换到Unicode
    120 LPWSTR CChineseConvertor::ToUnicode(char * szSource, int nEncoding)
    121 {
    122   int nLength;
    123   wchar_t *pBuffer;
    124   int nLanguage;
    125 
    126   if(nEncoding==CHINESE_SIMPLIFIED)
    127     nLanguage=936;
    128   else
    129     if(nEncoding==CHINESE_TRADITIONAL)
    130       nLanguage=950;
    131     else
    132       nLanguage= CP_ACP;
    133 
    134   nLength=MultiByteToWideChar(nLanguage,0,szSource,strlen(szSource),NULL,0);
    135   pBuffer=new wchar_t[nLength+1];
    136   MultiByteToWideChar(nLanguage,0,(LPCSTR)szSource,strlen(szSource),(LPWSTR)pBuffer,nLength);
    137   pBuffer[nLength]=0;
    138 
    139   return pBuffer;
    140 }
    141 
    142 //转换到多字节
    143 LPSTR CChineseConvertor::ToMultiByte(LPCWSTR szSource, int nEncoding)
    144 {
    145   int nLength;
    146   char *pBuffer;
    147   int nLanguage;
    148 
    149   if(nEncoding==CHINESE_SIMPLIFIED)
    150     nLanguage=936;
    151   else
    152     if(nEncoding==CHINESE_TRADITIONAL)
    153       nLanguage=950;
    154     else
    155       nLanguage= CP_ACP;
    156 
    157   nLength=WideCharToMultiByte(nLanguage,0,szSource,wcslen(szSource),NULL,0,m_pszUnknown,FALSE);
    158 
    159   pBuffer=new char[nLength+1];
    160   WideCharToMultiByte(nLanguage,0,szSource,wcslen(szSource),pBuffer,nLength,m_pszUnknown,FALSE);
    161   pBuffer[nLength]=0;
    162 
    163   return pBuffer;
    164 
    165 }
    166 
    167 //UTF8转换到UNICODE
    168 LPWSTR CChineseConvertor::UTF82UNICODE(char*   utf8str) 
    169 {
    170     int nLength;
    171     wchar_t *pBuffer;
    172     
    173     nLength=MultiByteToWideChar(CP_UTF8,0,utf8str,strlen(utf8str),NULL,0);
    174     pBuffer=new wchar_t[nLength+1];
    175     MultiByteToWideChar(CP_UTF8,0,(LPCSTR)utf8str,strlen(utf8str),(LPWSTR)pBuffer,nLength);
    176     pBuffer[nLength]=0;
    177     
    178     return pBuffer;
    179 }
    180 
    181 //UNICODE转换到UTF8
    182 LPSTR CChineseConvertor::UNICODE2UTF8(LPCWSTR  strText) 
    183 {
    184     int len;  
    185     len = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)strText, -1, NULL, 0, NULL, NULL);  
    186     char *szUtf8=new char[2*(len + 1)];
    187     memset(szUtf8, 0, len * 2 + 2);  //UTF8最多的字节数最多是一个UINICODE字符所占字节数的两倍
    188     WideCharToMultiByte (CP_UTF8, 0, (LPCWSTR)strText, -1, szUtf8, len, NULL,NULL);
    189     return szUtf8;
    190     
    191 }
  • 相关阅读:
    一维函数指针数组和二维函数指针数组demo
    等着新工作
    SSRS常见问题解决方案
    速度
    javascript 满足多层treeview的各种勾选
    vue create 初步解析以及定制化修改
    leveldb总结
    秋招总结场景设计题
    NOSQL: mongoDB windows
    更新webconfig配置文件
  • 原文地址:https://www.cnblogs.com/george-cw/p/5742713.html
Copyright © 2020-2023  润新知