中文内码转换简易算法

原创 2004年08月11日 19:03:00

中文内码转换类

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

}

用C语言实现常见的三种中文内码转换

用C语言实现常见的三种中文内码转换    常见的中文内码一般有GB2312(简体中文),GBK和台湾那边用的BIG5(繁体中文),有时候看一些台湾编程论坛里的资料,都是乱码,如果在IE中浏览,则要...
  • xjbclz
  • xjbclz
  • 2016年06月29日 22:48
  • 1428

RSA算法的简要实现(其实原理非常简单)

前面的博文(转载阮一峰)已经讲了RSA算法的基本原理。很久以前的博文曾涉及过模幂算法,今天终于可以登台亮相了,先回顾一下模幂算法的程序吧: #include using namespace std; ...
  • stpeace
  • stpeace
  • 2013年10月27日 17:28
  • 2863

画图程序简单实现

摘要:用C#向windows的画图看齐,实现了文件的打开与保存,直线/圆/曲线/点 等的形状绘制,可以自主选择粗细与颜色,并且应用派生的ArrayList类Step保存了每一步的操作,可以进行撤销与恢...
  • justice0
  • justice0
  • 2017年10月30日 19:31
  • 112

heroku 简易中文教程

这两天再看??《Ruby on Rails ?Tutorial - learn rails by Example》 - ?Michael Hartl , 里面提到如何使用Heroku (infoQ...
  • u010698554
  • u010698554
  • 2014年07月05日 10:32
  • 1279

用Latex排版论文(4)《大连海事大学硕博学位论文Latex模板》中算法排版例子(添加中文输入和输出)

最近一直在写硕士毕业论文,在LaTeXStudio上发现了由@智博是小叮当编写的《大连海事大学硕博学位论文latex模板》,所以就开始尝试使用该模板来写毕业论文,有种前人种树后人乘凉的感觉。     ...
  • kbawyg
  • kbawyg
  • 2014年03月05日 00:50
  • 3564

bouml的简易教程(中文)

Bouml -教程   本教程主要为了帮助您第一次起用BOUML。在这里仅显露BOUML少数的特点,而BOUML完整描述参见其参考手册。 本教程必须按序阅读,因为我不会每次重复诸如调用菜单等一般...
  • u013256622
  • u013256622
  • 2017年03月24日 22:37
  • 1512

ADOX.Catalog简易中文文档

1、ADOX 概述 Microsoft® ActiveX® Data Objects Extensions for Data Definition Language and Security (AD...
  • liuyukuan
  • liuyukuan
  • 2016年10月19日 16:55
  • 510

中文分词算法总结

什么是中文分词 众所周知,英文是以 词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,句子中所有的字连起来才能描述一个意思。例如,英文句子I am a student,用中文则为:“我是一...
  • Yelbosh
  • Yelbosh
  • 2015年05月21日 19:55
  • 26220

ADOX.Catalog简易中文文档

1、ADOX 概述 Microsoft® ActiveX® Data Objects Extensions for Data Definition Language and Security (AD...
  • Blue___Ocean
  • Blue___Ocean
  • 2014年10月11日 09:57
  • 511

Python 编码转换与中文处理

http://www.jianshu.com/p/53bb448fe85b python 中的 unicode是让人很困惑、比较难以理解的问题. 这篇文章 写的比较好,utf-8是 un...
  • haluoluo211
  • haluoluo211
  • 2017年02月28日 11:55
  • 307
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:中文内码转换简易算法
举报原因:
原因补充:

(最多只允许输入30个字)