熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

三種常見中文內碼的轉換方法!

2013-11-13 10:03:08  來源: .NET編程 
我們平時常見的三種中文內碼是GB(簡體中文)GBKBIG(繁體中文)網上有很多中文內碼的專用轉換工具我們碰到由於內碼不一致而導致的亂麻問題用這些工具可以進行相互轉換

  但論壇裡經常有人問如何在自己的程序中集成這些功能呢?本文將介紹如何利用 Windows 提供的API 函數來實現轉換涉及到的 API 函數主要有兩個MultiByteToWideChar 和 WideCharToMultiByte有關這兩個函數的詳細文檔請參考 MSDN本文不再贅述

  本文將介紹四個轉換函數分別實現如下的轉換

* Big => GBK
* GBK => Big
* GB => GBK
* GBK => GB

  有關 GB =〉BIG 的轉換以及 BIG =〉GB 的轉換可以通過 GBK 間接實現先將 GB 轉成 GBK再將 GBK 轉成 BIG反之亦然當然也可以自己實現它們之間的直接轉換

// Big => GBK

void BIGGBK(char *szBuf)
{
  if(!strcmp(szBuf ))
   return;
  int nStrLen = strlen(szBuf);
  wchar_t *pws = new wchar_t[nStrLen + ];
  try
  {
   int nReturn = MultiByteToWideChar( szBuf nStrLen pws nStrLen + );
   BOOL bValue = false;
   nReturn = WideCharToMultiByte( pws nReturn szBuf nStrLen + ? &bValue);
   szBuf[nReturn] = ;
  }
  __finally
  {
   delete[] pws;
  }
}


//
// GBK => Big

void GBKBIG(char *szBuf)
{

  if(!strcmp(szBuf ))
   return ;
  int nStrLen = strlen(szBuf);
  wchar_t *pws = new wchar_t[nStrLen + ];
  __try
  {
   MultiByteToWideChar( szBuf nStrLen pws nStrLen + );
   BOOL bValue = false;
   WideCharToMultiByte( pws nStrLen szBuf nStrLen + ? &bValue);
   szBuf[nStrLen] = ;
  }
  __finally
  {
   delete[] pws;
  }
}

//
// GB => GBK
void GBGBK(char *szBuf)
{
  if(!strcmp(szBuf ))
   return;
  int nStrLen = strlen(szBuf);
  WORD wLCID = MAKELCID(MAKELANGID(LANG_CHINESE SUBLANG_CHINESE_SIMPLIFIED) SORT_CHINESE_PRC);
  int nReturn = LCMapString(wLCID LCMAP_TRADITIONAL_CHINESE szBuf nStrLen NULL );
  if(!nReturn)
   return;
  char *pcBuf = new char[nReturn + ];
  __try
  {
   wLCID = MAKELCID(MAKELANGID(LANG_CHINESE SUBLANG_CHINESE_SIMPLIFIED) SORT_CHINESE_PRC);
   LCMapString(wLCID LCMAP_TRADITIONAL_CHINESE szBuf nReturn pcBuf nReturn + );
   strncpy(szBuf pcBuf nReturn);
  }
  __finally
  {
   delete[] pcBuf;
  }
}

  //
// GBK =〉GB

void GBKGB(char *szBuf)
{
  if(!strcmp(szBuf ))
   return;
  int nStrLen = strlen(szBuf);
  WORD wLCID = MAKELCID(MAKELANGID(LANG_CHINESE SUBLANG_CHINESE_SIMPLIFIED) SORT_CHINESE_BIG);
  int nReturn = LCMapString(wLCID LCMAP_SIMPLIFIED_CHINESE szBuf nStrLen NULL );
  if(!nReturn)
   return;

  char *pcBuf = new char[nReturn + ];
  __try
  {
   wLCID = MAKELCID(MAKELANGID(LANG_CHINESE SUBLANG_CHINESE_SIMPLIFIED) SORT_CHINESE_BIG);
   LCMapString(wLCID LCMAP_SIMPLIFIED_CHINESE szBuf nReturn pcBuf nReturn + );
   strncpy(szBuf pcBuf nReturn);
  }
  __finally
  {
   delete []pcBuf;
  }
}

// 調用示例



  char sourceEncode[];
  char szBuf[];

  // 從 GB 轉到 GBK
  strcpy(szBuf sourceEncode);
  GBGBK(szBuf);

  // 從GB 轉到 BIG通過 GBK 中轉
  strcpy(szBuf sourceEncode);
  GBGBK(szBuf);
  GBKBIG(szBuf);



}


From:http://tw.wingwit.com/Article/program/net/201311/12393.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.