简体与繁体转换

 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);

  1. //繁体环境下, GB简体 ==> Big5  
  2. std::string GB2Big(std::string strGb)  
  3. {  
  4.  int nLen = 0;  
  5.  
  6.  std::string strGbTrad;  
  7.  strGbTrad.resize(strGb.length() + 1);  
  8.  //1, 转换GB简体到GB繁体  
  9.  LCMapStringA(0x0804,LCMAP_TRADITIONAL_CHINESE, strGb.c_str(), -1, (char*)strGbTrad.c_str(), strGbTrad.length());  
  10.  
  11.  std::wstring strUnicode;  
  12.  nLen = MultiByteToWideChar (936, 0, strGbTrad.c_str(), -1, NULL, 0);  
  13.  strUnicode.resize(nLen);  
  14.  //2, 转换GB繁体到Unicode  
  15.  MultiByteToWideChar (936, 0, strGbTrad.c_str(), -1, (wchar_t*)strUnicode.c_str(), nLen);  
  16.    
  17.  std::string strBig5;  
  18.  nLen = WideCharToMultiByte (950, 0, (PWSTR)strUnicode.c_str(), -1, NULL, 0, NULL, NULL);  
  19.  strBig5.resize(nLen);  
  20.     //3, 转换Unicode到Big5  
  21.  WideCharToMultiByte (950, 0, (PWSTR)strUnicode.c_str(), -1, (char*)strBig5.c_str(), nLen, NULL, NULL);  
  22.  strBig5.resize(nLen - 1);  
  23.  
  24.  return strBig5;  
  25. }  
  26.  
  27. //简体环境下,Big5 ==> GB简体  
  28. std::string Big2GB(std::string strBig5)  
  29. {  
  30.  int nLen = 0;  
  31.  
  32.  std::wstring strUnicode;  
  33.  nLen = MultiByteToWideChar(950, 0, (char*)strBig5.c_str(), -1, NULL, 0);  
  34.  strUnicode.resize(nLen);  
  35.  //1, 转换big5到Unicode  
  36.  MultiByteToWideChar(950, 0, (char*)strBig5.c_str(), -1, (wchar_t*)strUnicode.c_str(), nLen);  
  37.  
  38.  std::string strGbTrade;  
  39.  nLen = WideCharToMultiByte(936, 0, (PWSTR)strUnicode.c_str(), -1, NULL,0, NULL, NULL);  
  40.  strGbTrade.resize(nLen);  
  41.  //2, 转换Unicode到GB繁体  
  42.  WideCharToMultiByte(936, 0, (PWSTR)strUnicode.c_str(), -1, (char*)strGbTrade.c_str(), nLen, NULL, NULL);  
  43.  
  44.  nLen = strBig5.length() + 1;  
  45.  std::string strGB;  
  46.  strGB.resize(nLen);  
  47.  //3, 转换GB繁体到GB简体  
  48.  LCMapStringA(0x0804, LCMAP_SIMPLIFIED_CHINESE, (char*)strGbTrade.c_str(), -1, (char*)strGB.c_str(), nLen);  
  49.  strGB.resize(nLen - 1);  
  50.  return strGB;  
  51. }  
  52.  
  53.  
  54. // 是中文系统,则返回值大于0, 返回1为简体中文, 返回2为繁体中文  
  55. // 其他情况返回0  
  56. int SystemLanIsChinese()  
  57. {  
  58.  UINT nLanID = GetSystemDefaultLangID();   
  59.  WORD PriLan = PRIMARYLANGID(nLanID);   
  60.  WORD SubLan = SUBLANGID(nLanID);   
  61.  
  62.  if (PriLan == LANG_CHINESE)  
  63.  {  
  64.   if (SubLan == SUBLANG_CHINESE_SIMPLIFIED)   
  65.    return 1;   //系统是简体中文   
  66.   else if (SubLan == SUBLANG_CHINESE_TRADITIONAL)   
  67.    return 2;   //系统是繁体中文   
  68.  }  
  69.  return 0; //其他版本  
  70. }