最早的程序(C/S架构)两端都没有考虑Unicode问题.风格也是很纯洁的C风格,也没什么大问题.
直到现在, 发现有时候需要解决在简体中文上直接显示繁体中文, 日文, 韩文等字符时,问题才变得狗血了.
如果修改程序支持UNICODE, 改动量实在太大, 估计可以直接重写一遍算了.呵呵,还是放过自己,多睡点觉。
少熬点夜吧.
好吧, 既然要偷懒,那我就GOOGLE,一路G来, 网上找到了简繁体中文的转换思路和参考代码.虽然可能有点开销,
不过在目前强大的CPU面前,根本也是小菜一碟,这也是不改动程序编码方式的一个解决方法。
认真看了下其中的思路,就是利用"GBK编码收录了Unicode基本多文种平面中的所有CJK汉字。
同 GB2312一样,GBK也支持希腊字母、日文假名字母、俄语字母等字符,但不支持韩语中的表音字符
(非汉字字符)。GBK还收录了GB2312不包含的汉字部首符号、竖排标点符号等字符。"
测试平台: 
客户端运行在繁体中文XP,日文XP,韩文XP,俄文XP....
服务端运行在简体中文Windows 7 上。繁体中文<->简体中文转换 思路:繁体中文 ANSI->繁体中文Unicode->GBK ANSI
相关代码:///////////////////////////////////////////////////////////////////////////////////
//BIG5<->GBK
///////////////////////////////////////////////////////////////////////////////////
//---------------------------------------------------------------------------
// Big5 => GBK:
// い地チ㎝瓣 --> 中華人民共和國
void BIG52GBK(char *szBuf)
{
if(!strcmp(szBuf, ""))
return;

int nStrLen = strlen(szBuf);
wchar_t *pws = new wchar_t[nStrLen + 1];

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; delete[] pws;
}
//---------------------------------------------------------------------------
// GBK => Big5
// 中華人民共和國 --> い地チ㎝瓣
void GBK2BIG5(char *szBuf)
{
if(!strcmp(szBuf, ""))
return;

 int nStrLen = strlen(szBuf);
 wchar_t *pws = new wchar_t[nStrLen + 1];
 
 MultiByteToWideChar(936, 0, szBuf, nStrLen, pws, nStrLen + 1);
 BOOL bValue = false;
 WideCharToMultiByte(950, 0, pws, nStrLen, szBuf, nStrLen + 1, "?", &bValue);
 szBuf[nStrLen] = 0;  delete[] pws;
}通过调用上面的,BIG52GBK和GBK2BIG5,即可实现简繁体中文转换,
实现在简体中文系统上显示繁体中文,在繁体中文上也可以实现显示简体中文的功能.
现在来问题来了,实在是被这么复杂的编码方式搞晕了,
这个世界要只有一种语言多好!!!或只有一个编码方式多好!而我的问题却有3个!!!
问题1:我用同样的思路,也实现了简体中文系统上对日文字符的正常显示,
日文 ANSI->日文Unicode->GBK ANSI是不是所有的日文字符,GBK都可以完整显示?
(我靠,赚大发了,字符集就说明了小日本和天朝之间的文化上的隶属关系!!! 哈哈)
问题2:我用同样的思路,希望继续实现了对韩文字符的正常显示,
韩文ANSI->韩文Unicode->GBK ANSI即希望可在简体中文上正常显示韩文字符.可这次,很不幸,乱码"?"出现了.相关代码:///////////////////////////////////////////////////////////////////////////////////
//KOR<->GBK
///////////////////////////////////////////////////////////////////////////////////
void KOR2GBK(char *szBuf)
{
if(!strcmp(szBuf, ""))
return;

int nStrLen = strlen(szBuf);
wchar_t *pws = new wchar_t[nStrLen + 1];
int nReturn = MultiByteToWideChar(949, 0, szBuf, nStrLen, pws, nStrLen + 1);
BOOL bValue = false;
nReturn = WideCharToMultiByte(936, 0, pws, nReturn, szBuf, nStrLen + 1, "?", &bValue);
szBuf[nReturn] = 0;

delete[] pws;
}void GBK2KOR(char *szBuf)
{
if(!strcmp(szBuf, ""))
return;

int nStrLen = strlen(szBuf);
wchar_t *pws = new wchar_t[nStrLen + 1];

MultiByteToWideChar(936, 0, szBuf, nStrLen, pws, nStrLen + 1);
BOOL bValue = false;
WideCharToMultiByte(949, 0, pws, nStrLen, szBuf, nStrLen + 1, "?", &bValue);
szBuf[nStrLen] = 0;

delete[] pws;
}看看上面的对GBK的介绍,我估计是因为"但不支持韩语中的表音字符(非汉字字符)"的缘故.
所以,在简体中文GBK上,如何完整地实现对韩文字符的全部显示呢?问题3:按照"GBK包含俄文字符"的说明,我接着希望能在GBK上,完整显示俄文.相关代码:///////////////////////////////////////////////////////////////////////////////////
//Cyrillic<->GBK
///////////////////////////////////////////////////////////////////////////////////
void CRY2GBK(char *szBuf)
{
if(!strcmp(szBuf, ""))
return;

int nStrLen = strlen(szBuf);
wchar_t *pws = new wchar_t[nStrLen + 1];
int nReturn = MultiByteToWideChar(1251, 0, szBuf, nStrLen, pws, nStrLen + 1);
BOOL bValue = false;
nReturn = WideCharToMultiByte(936, 0, pws, nReturn, szBuf, nStrLen + 1, "?", &bValue);
szBuf[nReturn] = 0;

delete[] pws;
}void GBK2CRY(char *szBuf)
{
if(!strcmp(szBuf, ""))
return;

int nStrLen = strlen(szBuf);
wchar_t *pws = new wchar_t[nStrLen + 1];

MultiByteToWideChar(936, 0, szBuf, nStrLen, pws, nStrLen + 1);
BOOL bValue = false;
WideCharToMultiByte(1251, 0, pws, nStrLen, szBuf, nStrLen + 1, "?", &bValue);
szBuf[nStrLen] = 0;

delete[] pws;
}
但是这次问题更严重了,所有返回的SZBUF,都成了空.进入CRY2GBK函数调试发现,第一次调用MultiByteToWideChar返回的nReturn长度居然等于nStrlen的长度, 
按照上面的转换繁体中文和日文的经验,第一个的nReturn长度正常情况下,应该等于nStrlen的一半.正是这个地方
的不和谐,最终导致WideCharToMultiByte返回的nReturn长度为0,转换失败.这里只能请教达人解惑了???
因为我继续希望能完成对希腊文的直接现实工作.
总结下问题:1.GBK是否包含了所有可显示的日文字符?2.韩文字符有一部分不在GBK里,如何解决?3.俄文转换为何出现了长度的异常? 希腊文是否也可以直接全部现实?
有懂的TX,就麻烦帮忙解惑下.代码我已经都贴出来了.不懂的TX也可以参考,一同进步.