简体与繁体转换
1, 简体环境下的Unicode字符,到了繁体环境下,然后把Unicode字符转为Ansi, 由于WideCharToMultiByte转换的,会有些字符显示为"?"号;
2, 繁体环境下的简体字符,转换为繁体字符,可以通过LCMapStringA
查表得到繁体字符。
例如:以"文档系统"为例分析在上面两种情况下会出现的结果
1, ?案系?
简体中文下的Unicode, 到繁体下用了WideCharToMultiByte转换
1, 紫偶炵苀
在繁体环境下,用查表函数转换简体字符得的结果
LCMapStringA(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL), LCMAP_TRADITIONAL_CHINESE, lpSrcStr, -1, lpDestStr, 25);
- //繁体环境下, GB简体 ==> Big5
- std::string GB2Big(std::string strGb)
- {
- int nLen = 0;
- std::string strGbTrad;
- strGbTrad.resize(strGb.length() + 1);
- //1, 转换GB简体到GB繁体
- LCMapStringA(0x0804,LCMAP_TRADITIONAL_CHINESE, strGb.c_str(), -1, (char*)strGbTrad.c_str(), strGbTrad.length());
- std::wstring strUnicode;
- nLen = MultiByteToWideChar (936, 0, strGbTrad.c_str(), -1, NULL, 0);
- strUnicode.resize(nLen);
- //2, 转换GB繁体到Unicode
- MultiByteToWideChar (936, 0, strGbTrad.c_str(), -1, (wchar_t*)strUnicode.c_str(), nLen);
- std::string strBig5;
- nLen = WideCharToMultiByte (950, 0, (PWSTR)strUnicode.c_str(), -1, NULL, 0, NULL, NULL);
- strBig5.resize(nLen);
- //3, 转换Unicode到Big5
- WideCharToMultiByte (950, 0, (PWSTR)strUnicode.c_str(), -1, (char*)strBig5.c_str(), nLen, NULL, NULL);
- strBig5.resize(nLen - 1);
- return strBig5;
- }
- //简体环境下,Big5 ==> GB简体
- std::string Big2GB(std::string strBig5)
- {
- int nLen = 0;
- std::wstring strUnicode;
- nLen = MultiByteToWideChar(950, 0, (char*)strBig5.c_str(), -1, NULL, 0);
- strUnicode.resize(nLen);
- //1, 转换big5到Unicode
- MultiByteToWideChar(950, 0, (char*)strBig5.c_str(), -1, (wchar_t*)strUnicode.c_str(), nLen);
- std::string strGbTrade;
- nLen = WideCharToMultiByte(936, 0, (PWSTR)strUnicode.c_str(), -1, NULL,0, NULL, NULL);
- strGbTrade.resize(nLen);
- //2, 转换Unicode到GB繁体
- WideCharToMultiByte(936, 0, (PWSTR)strUnicode.c_str(), -1, (char*)strGbTrade.c_str(), nLen, NULL, NULL);
- nLen = strBig5.length() + 1;
- std::string strGB;
- strGB.resize(nLen);
- //3, 转换GB繁体到GB简体
- LCMapStringA(0x0804, LCMAP_SIMPLIFIED_CHINESE, (char*)strGbTrade.c_str(), -1, (char*)strGB.c_str(), nLen);
- strGB.resize(nLen - 1);
- return strGB;
- }
- // 是中文系统,则返回值大于0, 返回1为简体中文, 返回2为繁体中文
- // 其他情况返回0
- int SystemLanIsChinese()
- {
- UINT nLanID = GetSystemDefaultLangID();
- WORD PriLan = PRIMARYLANGID(nLanID);
- WORD SubLan = SUBLANGID(nLanID);
- if (PriLan == LANG_CHINESE)
- {
- if (SubLan == SUBLANG_CHINESE_SIMPLIFIED)
- return 1; //系统是简体中文
- else if (SubLan == SUBLANG_CHINESE_TRADITIONAL)
- return 2; //系统是繁体中文
- }
- return 0; //其他版本
- }