中文内码转换类
??? 中文分为简体、繁体两种内码,另外还有统一码,如果要在不同码之间转换,需要有一个对应表格,程序编写起来非常繁琐,而且更要有内码对照表格。笔者,在阅读MSDN中发现只要妙用MultiByteToWideChar和LCMapString两函数,就可以简简单单地实现不同内码的转换。为了让程序员使用更方便,笔者编写了一个CChineseConvertor类,包装了所有中文内码的转换功能。读者可以直接在MFC中加入此类,用起来也非常轻松。详细细节请察看ChineseConvertor.h和ChineseConvertor.cpp源代码。
本源代码遵从GNU无偿提供给读者,无版权限制。
赵献宽
#pragma once #include "afx.h"
class CChineseConvertor : ?public CObject { public: ?CChineseConvertor(void); ?~CChineseConvertor(void); ?CString Big52GBKSimplified(CString szText); ?CString Big52GBKTraditional(CString szText); ?CString GBK2Big5(CString szText); ?LPTSTR GBKSimplified2GBKTraditional(CString szSimplified); ?LPTSTR GBKTraditional2GBKSimplified(CString szTraditional);
?char *m_pszUnknown; ?// 转换到Unicode ?LPWSTR ToUnicode(CString szSource, int nEncoding); ?LPTSTR ToMultiByte(LPWSTR szSource, int nEncoding); };
#include "stdafx.h" #include "chineseconvertor.h"
CChineseConvertor::CChineseConvertor(void) { ?m_pszUnknown = new char[2]; ?m_pszUnknown[0]='?'; ?m_pszUnknown[1]=0; }
CChineseConvertor::~CChineseConvertor(void) { ?delete m_pszUnknown; }
CString CChineseConvertor::Big52GBKSimplified(CString szText) { ?int nLength; ?wchar_t *pBuffer; ?LPSTR pResult; ?int nResultLength;
?nLength=MultiByteToWideChar(950,0,szText,szText.GetLength(),NULL,0); ?pBuffer=new wchar_t[nLength+1]; ?MultiByteToWideChar(950,0,(LPCTSTR)szText,szText.GetLength(),(LPWSTR)pBuffer,nLength); ?pBuffer[nLength]=0;
?nResultLength=WideCharToMultiByte(936,0,pBuffer,nLength,NULL,0,m_pszUnknown,FALSE); ?pResult=new char[nResultLength+1]; ?WideCharToMultiByte(936,0,(LPWSTR)pBuffer,nLength,(LPSTR)pResult,nResultLength,"?",FALSE); ?pResult[nResultLength]=0;
?return GBKTraditional2GBKSimplified(pResult); ? }
CString CChineseConvertor::Big52GBKTraditional(CString szText) { ?int nLength; ?wchar_t *pBuffer; ?LPSTR pResult; ?int nResultLength;
?nLength=MultiByteToWideChar(950,0,szText,szText.GetLength(),NULL,0); ?pBuffer=new wchar_t[nLength+1]; ?MultiByteToWideChar(950,0,(LPCTSTR)szText,szText.GetLength(),(LPWSTR)pBuffer,nLength); ?pBuffer[nLength]=0;
?nResultLength=WideCharToMultiByte(936,0,pBuffer,nLength,NULL,0,m_pszUnknown,FALSE); ?pResult=new char[nResultLength+1]; ?WideCharToMultiByte(936,0,(LPWSTR)pBuffer,nLength,(LPSTR)pResult,nResultLength,"?",FALSE); ?pResult[nResultLength]=0;
?return pResult; }
LPTSTR CChineseConvertor::GBKTraditional2GBKSimplified(CString szTraditional) { ?LCID dwLocale; ?WORD wLangID; ?wLangID=MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED); ?dwLocale=MAKELCID(wLangID,SORT_CHINESE_PRC);
?int nLength; ?char *pBuffer; ?nLength=LCMapString(dwLocale,LCMAP_SIMPLIFIED_CHINESE,(LPCTSTR)szTraditional,szTraditional.GetLength(),NULL,0); ?pBuffer=new char[nLength+1]; ?pBuffer[nLength]=0; ?LCMapString(dwLocale,LCMAP_SIMPLIFIED_CHINESE,(LPCTSTR)szTraditional,szTraditional.GetLength(),pBuffer,nLength); ?return pBuffer; }
CString CChineseConvertor::GBK2Big5(CString szText) { ?LPTSTR szGBKTraditional; ?int nLength; ?wchar_t *pBuffer; ?LPSTR pResult; ?int nResultLength;
?szGBKTraditional=GBKSimplified2GBKTraditional(szText); ?nLength=MultiByteToWideChar(936,0,szGBKTraditional,strlen(szGBKTraditional),NULL,0); ?pBuffer=new wchar_t[nLength+1]; ?MultiByteToWideChar(936,0,(LPCTSTR)szGBKTraditional,strlen(szGBKTraditional),(LPWSTR)pBuffer,nLength); ?pBuffer[nLength]=0;
?nResultLength=WideCharToMultiByte(950,0,pBuffer,nLength,NULL,0,m_pszUnknown,FALSE); ?pResult=new char[nResultLength+1]; ?WideCharToMultiByte(950,0,(LPWSTR)pBuffer,nLength,(LPSTR)pResult,nResultLength,"?",FALSE); ?pResult[nResultLength]=0;
?return pResult; }
//将GBK的简体转换到GBK繁体 LPTSTR CChineseConvertor::GBKSimplified2GBKTraditional(CString szSimplified) { ?LCID dwLocale; ?WORD wLangID; ?wLangID=MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED); ?dwLocale=MAKELCID(wLangID,SORT_CHINESE_PRC);
?int nLength; ?char *pBuffer; ?nLength=LCMapString(dwLocale,LCMAP_TRADITIONAL_CHINESE,(LPCTSTR)szSimplified,szSimplified.GetLength(),NULL,0); ?pBuffer=new char[nLength+1]; ?pBuffer[nLength]=0; ?LCMapString(dwLocale,LCMAP_TRADITIONAL_CHINESE,(LPCTSTR)szSimplified,szSimplified.GetLength(),pBuffer,nLength); ?return pBuffer; }
// 转换到Unicode LPWSTR CChineseConvertor::ToUnicode(CString szSource, int nEncoding) { ?int nLength; ?wchar_t *pBuffer; ?int nLanguage;
?if(nEncoding==CHINESE_SIMPLIFIED) ??nLanguage=936; ?else ??if(nEncoding==CHINESE_TRADITIONAL) ???nLanguage=950; ??else ???nLanguage= CP_ACP;
?nLength=MultiByteToWideChar(nLanguage,0,szSource,szSource.GetLength(),NULL,0); ?pBuffer=new wchar_t[nLength+1]; ?MultiByteToWideChar(nLanguage,0,(LPCTSTR)szSource,szSource.GetLength(),(LPWSTR)pBuffer,nLength); ?pBuffer[nLength]=0;
?return pBuffer; }
LPTSTR CChineseConvertor::ToMultiByte(LPWSTR szSource, int nEncoding) { ?int nLength; ?char *pBuffer; ?int nLanguage;
?if(nEncoding==CHINESE_SIMPLIFIED) ??nLanguage=936; ?else ??if(nEncoding==CHINESE_TRADITIONAL) ???nLanguage=950; ??else ???nLanguage= CP_ACP;
?nLength=WideCharToMultiByte(nLanguage,0,szSource,wcslen(szSource),NULL,0,m_pszUnknown,FALSE);
?pBuffer=new char[nLength+1]; ?WideCharToMultiByte(nLanguage,0,szSource,wcslen(szSource),pBuffer,nLength,m_pszUnknown,FALSE); ?pBuffer[nLength]=0;
?return pBuffer;
}

|