中文内码转换类
??? 中文分为简体、繁体两种内码,另外还有统一码,如果要在不同码之间转换,需要有一个对应表格,程序编写起来非常繁琐,而且更要有内码对照表格。笔者,在阅读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;
}