登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

图像处理 视频分析 机器视觉 模式识别

方向比努力更重要

 
 
 

日志

 
 
关于我

河北软件开发项目,电子警察卡口项目,公安天网项目,媒体流处理,数字图像处理。媒体服务器 RTSP、图像处理、车牌识别……DCT变换,H.264压缩

原创 utf8转换  

2012-02-04 09:26:58|  分类: VC++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

CString   Convert(CString   str,   int   sourceCodepage,   int   targetCodepage)
{
 int   len=str.GetLength();
 
 int   unicodeLen=MultiByteToWideChar(sourceCodepage,0,str,-1,NULL,0);
 
 wchar_t *   pUnicode;
 pUnicode=new   wchar_t[unicodeLen+1];
 
 memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
 
 
 MultiByteToWideChar(sourceCodepage,0,str,-1,(LPWSTR)pUnicode,unicodeLen);
 
 BYTE   *   pTargetData;
 int   targetLen=WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char   *)pTargetData,0,NULL,NULL);
 
 pTargetData=new   BYTE[targetLen+1];
 memset(pTargetData,0,targetLen+1);
 
 WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char   *)pTargetData,targetLen,NULL,NULL);
 
 CString   rt;
 rt.Format( "%s ",pTargetData);
 
 delete   pUnicode;
 delete   pTargetData;
 return   rt;
 
}
//用法
void CTestDlg::OnButton1()
{
 // TODO: Add your control notification handler code here
 //CString str2,str1 = "%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AF%E6%8F%90%E7%A4%BA%E4%BF%A1%E6%81%AF%EF%BC%9A%E6%8E%A5%E5%8F%A3ID%E5%8F%B7%E7%A0%81%E5%AE%9A%E4%B9%89%E4%B8%8D%E8%A7%84%E8%8C%83%EF%BC%81";
 CString str2,str1 = "\xE6\x9C\x8D\xE5\x8A\xA1\xE5\x99\xA8\xE7\xAB\xAF\xE6\x8F\x90\xE7\xA4\xBA\xE4\xBF\xA1\xE6\x81\xAF\xEF\xBC\x9A\xE6\x8E\xA5\xE5\x8F\xA3ID\xE5\x8F\xB7\xE7\xA0\x81\xE5\xAE\x9A\xE4\xB9\x89\xE4\xB8\x8D\xE8\xA7\x84\xE8\x8C\x83\xEF\xBC\x81";
 //******************************************************************************************************
 //带有百分号的格式是不对的,要把百分号转换成\x才行,原因如下:

\xhh 任意字符 二位十六进制

'A', '\x2f', '\013'; 

\x表示后面的字符是十六进制数,\0表示后面的字符是八进制数。 
 *****************************************************************************//
 str2 = Convert(str1,CP_UTF8,936);
 str2.AllocSysString();
}
________________________________

字符表

  所有的转义字符和所对应的意义:

  

转义字符 意义 ASCII码值(十进制)
\a 响铃(BEL) 007
\b 退格(BS) 008
\f 换页(FF) 012
\n 换行(LF) 010
\r 回车(CR) 013
\t 水平制表(HT) 009
\v 垂直制表(VT) 011
\\ 反斜杠 092
\? 问号字符 063
\' 单引号字符 039
\" 双引号字符 034
\0 空字符(NULL) 000
\ddd 任意字符 三位八进制
\xhh 任意字符 二位十六进制

字符型常量

  字符型常量所表示的值是字符型变量所能包含的值。我们可以用ASCII表达式来表示一个字符型常量,或者用单引号内加反斜杠表示转义字符。

  'A', '\x2f', '\013';

  其中:\x表示后面的字符是十六进制数,\0表示后面的字符是八进制数。

  注意:在Turbo C 2.0中,字符型常量表示数的范围是-128到127,除非你把它声明为unsigned,这样就是0到255。

  上面我们见到的\x,\n,\a等等都是叫转义字符,它告诉编译器需要用特殊的方式进行处理。


__________________________________________________________________________

呕心沥血写的转换函数

 

// 四创安通动态库.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#define DLL_EXPORT
#include "四创安通动态库_UTF.h"


char Buf[255];
Ralf_DLL_DEC  char*  Convert(char * str_Utf8)
{
 char *Buf_UTF = NULL;
 
 Buf_UTF = new char[1024 * 1024];
 memset(Buf_UTF,0,1024 * 1024);
 
 CString TempStr = str_Utf8;//传进的是16进制数
 int n = 0;
 int pos1 = TempStr.Find('%');
 int pos2;
 bool bExit = false;
 while (true)
 {
  CString StrConvert;
  pos2 = TempStr.Find('%',pos1 +1 );
  if (pos2 == -1)
  {
   pos2 =TempStr.GetLength();
   bExit = true;
  }
  if ((pos2 - pos1) == 3)
  {
   StrConvert = TempStr.Mid(pos1+1,2);
   int nNum = _tcstol(StrConvert, NULL, 16);
   Buf_UTF[n] = (char)nNum;
   n++;
  }
  else
  {
   StrConvert = TempStr.Mid(pos1+1,2);
   int nNum = _tcstol(StrConvert, NULL, 16);
   Buf_UTF[n] = (char)nNum;
   n++;
   int Count = pos2 - pos1 - 3;
   strncpy(&Buf_UTF[n],TempStr.Mid(pos1 + 3,pos2 -pos1),Count);
   n += Count;
  }
  if (bExit)
  {
   break;
  }
  pos1 = pos2;
 } 

 //开始转换
 CString str = Buf_UTF;
 int   len=str.GetLength();
 
 int   sourceCodepage = 65001,targetCodepage=936;
 
 int   unicodeLen=MultiByteToWideChar(sourceCodepage,0,str,-1,NULL,0);
 
 wchar_t *   pUnicode;
 pUnicode=new   wchar_t[unicodeLen+1];
 
 memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
 
 MultiByteToWideChar(sourceCodepage,0,str,-1,(LPWSTR)pUnicode,unicodeLen);
 
 BYTE   *   pTargetData;
 int   targetLen=WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char   *)pTargetData,0,NULL,NULL);
 
 pTargetData=new   BYTE[targetLen+1];
 memset(pTargetData,0,targetLen+1);
 
 WideCharToMultiByte(targetCodepage,0,(LPWSTR)pUnicode,-1,(char   *)pTargetData,targetLen,NULL,NULL);
 
 CString   rt;
 rt.Format( "%s",pTargetData);
 
 delete   pUnicode;
 delete   pTargetData;
 
 
 memset(Buf,0,255);
 strncpy(Buf,rt.GetBuffer(0),rt.GetLength());
 
 delete [] Buf_UTF;
 return Buf;
}

  评论这张
 
阅读(1382)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018