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