文字与UNICODE间的相互转换

这是一个使用VS2010编写的C++程序,展示了如何进行文字到UNICODE和UNICODE到文字的转换。通过CStringW数据类型,程序实现了16进制表示的UNICODE生成和解析,包括对字符的高8位和低8位的处理。源代码包含详细注释,并提供了一个Release版本的软件下载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明:这是在VS2010下写的程序,其中有一个CStringW的数据类型,在VC6下是无法识别的,但是在VS2010下可以用,至于在VS2008和VS2005中能否运用我没有测试过。以下就是相关的代码段了。程序都是加了注释的,而且写得也比较直白。生成的Release版本的软件我已经在优快云上传了。欢迎大家留意,相互交流!

HRESULT CCode_TransformDlg::OnButtonOK(IHTMLElement* /*pElement*/)
{
  CStringW str;
    GetDlgItemTextW(IDC_EDIT_ORIGINAL,str);

 if(((CButton*)GetDlgItem(IDC_RADIO_TU))->GetCheck())//文字向UNICODE转换
     SetDlgItemTextW(IDC_EDIT_HEX,ShowHex(str));//在EDIT BOX显示UNICODE
 else//UNICODE向文字转换
        SetDlgItemTextW(IDC_EDIT_HEX,TranslateUnicode(str));//显示对应的文字
 //OnOK();
 return S_OK;
}

 

//===========================================================================
//*****************将信息转换为16进制表示的UNICODE****************************
CString CCode_TransformDlg::ShowHex(CStringW msg)
{
 CString unicodestring;
 for(size_t i=0;i<msg.GetLength();++i)
  unicodestring+=(Transform(msg.GetAt(i))+L"  ");
 return unicodestring;
}

//=========================================================================== 
//**************将一个宽字符转换为相应的UNICODE******************************
CString CCode_TransformDlg::Transform(WCHAR wch)
{
 CString temp;
 //分别获取一个宽字符的高8位和第8位的UNICODE
 temp=GetHexStr(((wch>>8)&0xff))+GetHexStr(wch&0xff);
 return temp;
}


//===========================================================================
//****************将一个字节的数据转换为2位十六进制的串**********************
CString CCode_TransformDlg::GetHexStr(BYTE data)
{
 CString temp;
 //将一个字节的高4位和底4位分别转换为对应的16进制字符串
 temp=GetHexChar(data/16)+GetHexChar(data%16);
 return temp;
}

//==========================================================================
//***************将0-15的十进制数字转为一个16进制的字符*********************
CString CCode_TransformDlg::GetHexChar(unsigned int data)
{
 CString str;
 switch(data)
 {
 case 0:str=L"0";
  break;
 case 1:str=L"1";
  break;
 case 2:str=L"2";
  break;
 case 3:str=L"3";
  break;
 case 4:str=L"4";
  break;
 case 5:str=L"5";
  break;
 case 6:str=L"6";
  break;
 case 7:str=L"7";
  break;
 case 8:str=L"8";
  break;
 case 9:str=L"9";
  break;
 case 10:str=L"A";
  break;
 case 11:str=L"B";
  break;
 case 12:str=L"C";
  break;
 case 13:str=L"D";
  break;
 case 14:str=L"E";
  break;
 case 15:str=L"F";
  break;
 default:break;
 }
 return str;
}


//============================================================================
//********************将一串UNICODE转换为文字**********************************
CString CCode_TransformDlg::TranslateUnicode(CStringW unicodestr)
{
 CString text;
 unicodestring=unicodestr;//unicodestring用于保存包含了'0'和'X'进制串
    unicodestring.Replace(L" ",NULL);//去除字符串里的所有空格
 if(unicodestring.GetLength()%4)
 {
  AfxMessageBox(TEXT("4 characters constitute a hex-string without /"0x/" or /"0X/""));
  return L"";
 }
 bool flag=true;
 for(size_t index=0;index<unicodestring.GetLength()&&flag;index+=4)
 {
  WCHAR wch=0;
  for(int i=0;i<4&&flag;++i)
  {
      if(CheckUnicode(unicodestring.GetAt(index+i)))
    wch+=ChangeHexToTen(unicodestring.GetAt(index+i))*(short)(pow(16.0,3-i));
   else
   {
    CString str;
    str.Format(TEXT("UNICODE ERROR AT INDEX:%d"),index+i+1);
    flag=false;
    AfxMessageBox(str);
   }
  }
  text+=wch;
 }
 return text;
}

//===========================================================================
//************检测输入的UNICODE是否正确(只能出现16进制的数)****************
bool CCode_TransformDlg::CheckUnicode(WCHAR wch)
{
 if(((wch>=L'0')&&(wch<=L'9'))||((wch>=L'A')&&(wch<=L'F'))||((wch>=L'a')&&(wch<=L'f')))
   return true;
 return false;
}


//===============================================================================
//**************将每一个十六进制的字符转化为一个十进制数************************
short CCode_TransformDlg::ChangeHexToTen(WCHAR wch)
{
 switch(wch)
 {

     case L'0':case L'1':case L'2':case L'3':case L'4':case L'5':case L'6':case L'7':case L'8':case L'9':
      return (wch-L'0');
      break;
  case L'A':case L'B':case L'C':case L'D':case L'E':case L'F':
   return (wch-L'A'+10);
   break;
  case L'a':case L'b':case L'c':case L'd':case L'e':case L'f':
   return (wch-L'a'+10);
   break;
  default:
   return 0;
   break;
 }
}

BOOL CCode_TransformDlg::PreTranslateMessage(MSG* pMsg)
{
 // TODO: Add your specialized code here and/or call the base class
 //截获回车消息并进行处理
 if(pMsg->wParam==VK_RETURN)
 { 
  CStringW str;
  GetDlgItemTextW(IDC_EDIT_ORIGINAL,str);
  if(((CButton*)GetDlgItem(IDC_RADIO_TU))->GetCheck())
      SetDlgItemTextW(IDC_EDIT_HEX,ShowHex(str));
  else SetDlgItemTextW(IDC_EDIT_HEX,TranslateUnicode(str));
 }
 return CDHtmlDialog::PreTranslateMessage(pMsg);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值