RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:9:30-18:00
你可能遇到了下面的问题
关闭右侧工具栏
中文内码转换简易算法
  • 作者: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);