中文三种内码转换方法


常见的中文内码有 gb2312(简体中文) gbk 和big5(繁体中文),为实现不同中文环境下实现中文字符的正确显示,Windows中提供了MultiByteToWideChar和WideCharToMultiByte两兄弟函数,实现不同环境下的字符内码转换,


// 中华人民共和国 --> 中華人民共和國

void GB232GBK(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,0 );

 
if ( ! nReturn)

return ;

 
char *pcBuf = new char[nReturn + 1 ];

 
try

 
{

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

LCMapString(wLCID, LCMAP_TRADITIONAL_CHINESE, szBuf, nReturn, pcBuf, nReturn
+ 1);

strncpy(szBuf, pcBuf, nReturn);

 }


 __finally

 
{

delete[] pcBuf;

 }

}

// GBK码转GB2312码

// 中華人民共和國 --> 中华人民共和国

void GBK2GB2312(char *szBuf)

{

 
if ( ! strcmp(szBuf, ""))

return ;

 
int nStrLen = strlen(szBuf);

 WORD wLCID
= MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_BIG5);

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

 
if ( ! nReturn)

return ;

 
char *pcBuf = new char[nReturn + 1 ];

 
try

 
{

wLCID
= MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_BIG5);

LCMapString(wLCID, LCMAP_SIMPLIFIED_CHINESE, szBuf, nReturn, pcBuf, nReturn
+ 1);

strncpy(szBuf, pcBuf, nReturn);

 }


 __finally

 
{

delete []pcBuf;

 }


}


// GBK转大五码

// 中華人民共和國 --> い地チ㎝瓣

void GBK2Big5(char *szBuf)

{

 
if ( ! strcmp(szBuf, ""))

return ;

 
int nStrLen = strlen(szBuf);

 wchar_t
* pws = newwchar_t[nStrLen +1 ];

 
try

 
{

MultiByteToWideChar(
936 , 0, szBuf, nStrLen, pws, nStrLen +1 );

BOOL bValue
= false;

WideCharToMultiByte(
950 , 0, pws, nStrLen, szBuf, nStrLen +1 , " ?" , &bValue);

szBuf[nStrLen]
= 0;

 }


 __finally

 
{

delete[] pws;

 }


}

   // 大五码转GBK码:

// い地チ㎝瓣 --> 中華人民共和國

  void Big52GBK(char *szBuf)

{

 
if ( ! strcmp(szBuf, ""))

return ;

 
int nStrLen = strlen(szBuf);

 wchar_t
* pws = newwchar_t[nStrLen +1 ];

 
try

 
{

int nReturn = MultiByteToWideChar(950 , 0, szBuf, nStrLen, pws, nStrLen +1 );

BOOL bValue
= false;

nReturn
= WideCharToMultiByte(936 , 0, pws, nReturn, szBuf, nStrLen +1 , " ?" , &bValue);

szBuf[nReturn]
= 0;

 }


 __finally

 
{

delete[] pws;

 }


}
 



         因此,要在繁体中文系统中正确显示简体中文编码的汉字,就必须把简体中文的gb2312先转换为gbk,再通过gbk转换为big5,这样放在繁体中文环境中就会显示繁体的中文汉字

        另外,如何判断一个字符串中是否有中文子,可以通过一个汉字的两个字节的编码范围来判断,首先判断当前字符串的编码格式,是gb2312 还是gbk ,如果是gb2312 则一个汉字的高字节范围为 0x81 -0xfe  低字节的范围为0x40-0xfe 但不包括0x7f, ,可以根据高字节和低字节的所在的位置判断当前的字符是否是中文字符,简体中文字符的编码规则为 高字节为行码  为0xa1--0xfe 第二字节为列码 为0xa1--0xfe 每行94个汉字

    其中 1到15行   0xa1--0xaf 全角字符 、符号

            16到55行  0xb0-0xcf 以拼音为序的一级汉字 3755字

            56到87行 0xD0到0xf7 以部首位序的二级汉字 3008字

例如gb2312码的16行1列表示“啊”字,编码为0xb0a1

港台电脑中的系统多以big5为编码格式,定义了13053个汉字,汉字部分为部首为序,编码如下:

第一字节:行码 0xa1--0xfe 

第二字节:列码 0x40-ox7e 0xa1-0xfe,每行157个汉字

其中,1-3行/38-40行(A1 到 A3)(C6到 C8)全角字符、符号

                   4-39行a4到c6 一级汉字5401字

                  41到89行  二级汉字7652字

例如 big5编码 “啊”的16行 121列 编码表示 为 0xb0DA






你可能感兴趣的:(c,windows,null,delete)