电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

三种常见中文内码的转换方法!


发布日期:2018/12/13
 
我们平时常见的三种中文内码是GB(简体中文)GBKBIG(繁体中文)网上有很多中文内码的专用转换工具我们碰到由于内码不一致而导致的乱麻问题用这些工具可以进行相互转换

但论坛里经常有人问如何在自己的程序中集成这些功能呢?本文将介绍如何利用 Windows 提供的API 函数来实现转换涉及到的 API 函数主要有两个MultiByteToWideChar 和 WideCharToMultiByte有关这两个函数的详细文档请参考 MSDN本文不再赘述

本文将介绍四个转换函数分别实现如下的转换

* Big => GBK

* GBK => Big

* GB => GBK

* GBK => GB

有关 GB =〉BIG 的转换以及 BIG =〉GB 的转换可以通过 GBK 间接实现先将 GB 转成 GBK再将 GBK 转成 BIG反之亦然当然也可以自己实现它们之间的直接转换

// Big => GBK

void BIGGBK(char *szBuf)

{

if(!strcmp(szBuf ))

return;

int nStrLen = strlen(szBuf);

wchar_t *pws = new wchar_t[nStrLen + ];

try

{

int nReturn = MultiByteToWideChar( szBuf nStrLen pws nStrLen + );

BOOL bValue = false;

nReturn = WideCharToMultiByte( pws nReturn szBuf nStrLen + ? &bValue);

szBuf[nReturn] = ;

}

__finally

{

delete[] pws;

}

}

//

// GBK => Big

void GBKBIG(char *szBuf)

{

if(!strcmp(szBuf ))

return ;

int nStrLen = strlen(szBuf);

wchar_t *pws = new wchar_t[nStrLen + ];

__try

{

MultiByteToWideChar( szBuf nStrLen pws nStrLen + );

BOOL bValue = false;

WideCharToMultiByte( pws nStrLen szBuf nStrLen + ? &bValue);

szBuf[nStrLen] = ;

}

__finally

{

delete[] pws;

}

}

//

// GB => GBK

void GBGBK(char *szBuf)

{

if(!strcmp(szBuf ))

return;

int nStrLen = strlen(szBuf);

WORD wLCID = MAKELCID(MAKELANGID(LANG_CHINESE SUBLANG_CHINESE_SIMPLIFIED) SORT_CHINESE_PRC);

int nReturn = LCMapString(wLCID LCMAP_TRADITIONAL_CHINESE szBuf nStrLen NULL );

if(!nReturn)

return;

char *pcBuf = new char[nReturn + ];

__try

{

wLCID = MAKELCID(MAKELANGID(LANG_CHINESE SUBLANG_CHINESE_SIMPLIFIED) SORT_CHINESE_PRC);

LCMapString(wLCID LCMAP_TRADITIONAL_CHINESE szBuf nReturn pcBuf nReturn + );

strncpy(szBuf pcBuf nReturn);

}

__finally

{

delete[] pcBuf;

}

}

//

// GBK =〉GB

void GBKGB(char *szBuf)

{

if(!strcmp(szBuf ))

return;

int nStrLen = strlen(szBuf);

WORD wLCID = MAKELCID(MAKELANGID(LANG_CHINESE SUBLANG_CHINESE_SIMPLIFIED) SORT_CHINESE_BIG);

int nReturn = LCMapString(wLCID LCMAP_SIMPLIFIED_CHINESE szBuf nStrLen NULL );

if(!nReturn)

return;

char *pcBuf = new char[nReturn + ];

__try

{

wLCID = MAKELCID(MAKELANGID(LANG_CHINESE SUBLANG_CHINESE_SIMPLIFIED) SORT_CHINESE_BIG);

LCMapString(wLCID LCMAP_SIMPLIFIED_CHINESE szBuf nReturn pcBuf nReturn + );

strncpy(szBuf pcBuf nReturn);

}

__finally

{

delete []pcBuf;

}

}

// 调用示例

char sourceEncode[];

char szBuf[];

// 从 GB 转到 GBK

strcpy(szBuf sourceEncode);

GBGBK(szBuf);

// 从GB 转到 BIG通过 GBK 中转

strcpy(szBuf sourceEncode);

GBGBK(szBuf);

GBKBIG(szBuf);

}

上一篇:得到刚刚插入的记录的自动编号值一例

下一篇:无法使用MSHFLXGD.OCX控件的解决办法