中文内码转换简易算法

原创 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;

}

中文内码转换简易算法

 中文内码转换类??? 中文分为简体、繁体两种内码,另外还有统一码,如果要在不同码之间转换,需要有一个对应表格,程序编写起来非常繁琐,而且更要有内码对照表格。笔者,在阅读MSDN中发现只要妙用Mult...
  • qiuxiangyong
  • qiuxiangyong
  • 2004年08月20日 16:05
  • 1007

中文内码转换代码

输入Big5字符,返回Gb简体字符    //---------------------------------------------------------------------------  ...
  • iu_81
  • iu_81
  • 2007年09月20日 22:42
  • 764

编码格式之间进行文本内码转换的库

iconv iconv是一个计算机程序以及一套应用程序编程接口的名称。它的作用是在多种国际编码格式之间进行文本内码的转换。目前版本为2.3.26,支持的内码包括: Unicode相关编...
  • hjh2005
  • hjh2005
  • 2012年05月11日 21:06
  • 743

常见的三种中文内码转换

//大五码->GBKfunction BIG52GBK(Value: string): string;var  iLength, iReturn: Integer;  sTmp: PWideChar;...
  • jlutt
  • jlutt
  • 2006年02月21日 09:19
  • 607

内码转换

http://207.44.226.183/index.php?fromuid=296842 所有会员注意...
  • benny5609
  • benny5609
  • 2008年01月14日 15:36
  • 712

常见的三种中文内码转换代码

作者:ccrun    更新:2005-10-13    浏览:11660常见的中文内码一般有GB2312(简体中文),GBK和台湾那边用的BIG5(繁体中文),有时候看一些台湾编程论坛里的资料,都是...
  • qq752923276
  • qq752923276
  • 2011年03月03日 16:56
  • 713

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

常见的中文内码一般有GB2312(简体中文),GBK和台湾那边用的BIG5(繁体中文),有时候看一些台湾编程论坛里的资料,都是乱码,如果在IE中浏览,则要求安装繁体字库的支持。网上也有很多中文内码的转...
  • sti01
  • sti01
  • 2005年11月08日 23:45
  • 955

一些简单的算法

入门算法冒泡排序时间复杂度o(n²),空间复杂度o(1),最差的排序。 快速排序,快速排序(Quicksort)是对冒泡排序的一种改进,排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经...
  • wanglei0622
  • wanglei0622
  • 2016年03月29日 11:41
  • 699

c# winform 汉字国标码、机内码、区位码的相互转换

今天有一个朋友找我让我帮忙写一个程序,要实现汉字国标码、机内码、区位码的相互转换 我们知道,汉字zai...
  • zinechina
  • zinechina
  • 2014年07月24日 23:55
  • 1206

C++常见的三种中文内码转换代码

常见的中文内码一般有GB2312(简体中文),GBK和台湾那边用的BIG5(繁体中文),有时候看一些台湾编程论坛里的资料,都是乱码,如果在IE中浏览,则要求安装繁体字库的支持。网上也有很多中文内码的转...
  • may680
  • may680
  • 2010年08月17日 15:05
  • 558
收藏助手
不良信息举报
您举报文章:中文内码转换简易算法
举报原因:
原因补充:

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