{
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;
}
评论