\u8f6c\u61\u7801\u62\u39\u8f6c\u21 明文是:转a码b9转!
现在想将\u8f6c\u61\u7801\u62\u39\u8f6c\u21转回明文 转a码b9转!
在csdn上有一个方法转换的,但是只能将纯汉字的转换,杂带其它字母或字符的都被转成问号了,请大家将下面这段代码改进一下,谢谢!
CString strText(_T("\u8f6c\u61\u7801\u62\u39\u8f6c\u21"));
int nCount = strText.Replace(_T("\\u"), _T(" 0x"));
wchar_t* buf = new wchar_t[nCount+1];
memset(buf, 0, sizeof(wchar_t)*(nCount+1));
int nIndex = 0;
TCHAR seps[] = _T(" ");
TCHAR* token = _tcstok(strText.GetBuffer(strText.GetLength()), seps);
while(NULL != token)
{
buf[nIndex++] = _tcstoul(token, NULL, 16);
token = _tcstok(NULL, seps);
}
strText.ReleaseBuffer();
AfxMessageBox(CString(buf));
delete[] buf;
buf = NULL;
贴子地址是:http://bbs.csdn.net/topics/370194751
34 个解决方案
#1
大侠快出招吧~
#2
把\u8f6c\u61\u7801\u62\u39\u8f6c\u21
补齐成
\u8f6c\u0061\u7801\u0062\u0039\u8f6c\u0021
补齐成
\u8f6c\u0061\u7801\u0062\u0039\u8f6c\u0021
#3
为何要被这样补,我是通过下面这个连接加密的
http://www.javawind.net/tools/native2ascii.jsp?action=transform
另外,各位,如果能用javascript解密也可以!
#4
为什么要这么补?
因为原本就是这样子的。你都知道这个是UNICODE的,是双字节字符,那些ASCII的字符自然要补上00。
因为原本就是这样子的。你都知道这个是UNICODE的,是双字节字符,那些ASCII的字符自然要补上00。
#5
use_conversion
T2A()
T2A()
#6
哦,明白了,谢谢!那怎么才能自动补上00呢
#7
不会用T2A
#8
有个非常奇怪的现象,如果是硬编码的下面这个strText变量,调试时鼠标移过去发现解成明文了,但是如果是变量的无法自动解成明文,这串unicode是一样的
CString strText(_T("\u5929\u7FFCe\u5BB6"));
CString strText(_T("\u5929\u7FFCe\u5BB6"));
#9
你可以先拆分成子串 8f6c , 61,...
然后2个字节的就补上00。
或者就直接对子串转换,也不用补了。
#10
void XXX::ConvertGBKToUtf8(CString& strGBK)
{
int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
unsigned short * wszUtf8 = new unsigned short[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, (LPWSTR)wszUtf8, len);
len = WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)wszUtf8, -1, NULL, 0, NULL, NULL);
char *szUtf8=new char[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, (LPWSTR)wszUtf8, -1, szUtf8, len, NULL,NULL);
strGBK = szUtf8;
delete[] szUtf8;
delete[] wszUtf8;
}
绝对好用
{
int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
unsigned short * wszUtf8 = new unsigned short[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, (LPWSTR)wszUtf8, len);
len = WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)wszUtf8, -1, NULL, 0, NULL, NULL);
char *szUtf8=new char[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, (LPWSTR)wszUtf8, -1, szUtf8, len, NULL,NULL);
strGBK = szUtf8;
delete[] szUtf8;
delete[] wszUtf8;
}
绝对好用
#11
void XXX::ConvertGBKToUtf8(CString& strGBK)
{
int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
unsigned short * wszUtf8 = new unsigned short[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, (LPWSTR)wszUtf8, len);
len = WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)wszUtf8, -1, NULL, 0, NULL, NULL);
char *szUtf8=new char[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, (LPWSTR)wszUtf8, -1, szUtf8, len, NULL,NULL);
strGBK = szUtf8;
delete[] szUtf8;
delete[] wszUtf8;
}
绝对好用
不得,还是 UNICODE码,另外你看一下
有个非常奇怪的现象,如果是硬编码的下面这个strText变量,调试时鼠标移过去发现解成明文了,但是如果是变量的无法自动解成明文,这串unicode是一样的
CString strText(_T("\u5929\u7FFCe\u5BB6"));
#12
为什么要这么补?
因为原本就是这样子的。你都知道这个是UNICODE的,是双字节字符,那些ASCII的字符自然要补上00。
哦,明白了,谢谢!那怎么才能自动补上00呢
你可以先拆分成子串 8f6c , 61,...
然后2个字节的就补上00。
或者就直接对子串转换,也不用补了。
嗯,这个明白了,你看一下这个怎么解决:
有个非常奇怪的现象,如果是硬编码的下面这个strText变量,调试时鼠标移过去发现解成明文了,但是如果是变量的无法自动解成明文,这串unicode是一样的
CString strText(_T("\u5929\u7FFCe\u5BB6"));
#13
嗯,这个明白了,你看一下这个怎么解决:
有个非常奇怪的现象,如果是硬编码的下面这个strText变量,调试时鼠标移过去发现解成明文了,但是如果是变量的无法自动解成明文,这串unicode是一样的
CString strText(_T("\u5929\u7FFCe\u5BB6"));
这说明VC编译器“看懂”了\u5929\u7FFCe\u5BB6,把它转换成了宽字符。就好象把"\r\n"变成0a 0d
#14
嗯,这个明白了,你看一下这个怎么解决:
有个非常奇怪的现象,如果是硬编码的下面这个strText变量,调试时鼠标移过去发现解成明文了,但是如果是变量的无法自动解成明文,这串unicode是一样的
CString strText(_T("\u5929\u7FFCe\u5BB6"));
这说明VC编译器“看懂”了\u5929\u7FFCe\u5BB6,把它转换成了宽字符。就好象把"\r\n"变成0a 0d
不懂怎么转了,下面的代码还是显示\u5929\u7FFCe\u5BB6, str是变量,值是\u5929\u7FFCe\u5BB6 ,
我的项目字符集是,多字节字符集的
char * pFileName = (char*)(LPCSTR)str;
USES_CONVERSION;
CString s = A2T(pFileName);
#15
嗯,这个明白了,你看一下这个怎么解决:
有个非常奇怪的现象,如果是硬编码的下面这个strText变量,调试时鼠标移过去发现解成明文了,但是如果是变量的无法自动解成明文,这串unicode是一样的
CString strText(_T("\u5929\u7FFCe\u5BB6"));
这说明VC编译器“看懂”了\u5929\u7FFCe\u5BB6,把它转换成了宽字符。就好象把"\r\n"变成0a 0d
不懂怎么转了,下面的代码还是显示\u5929\u7FFCe\u5BB6, str是变量,值是\u5929\u7FFCe\u5BB6 ,
我的项目字符集是,多字节字符集的
char * pFileName = (char*)(LPCSTR)str;
USES_CONVERSION;
CString s = A2T(pFileName);
你这个是要做什么?如果要从宽字符转为多字节,使用WideCharToMultiByte
硬编码的时候VC编译器会负责转换,你用UE去搜索编译出来的exe文件,搜索二进制29 59 FC 7F,看看能不能搜得出来
#16
嗯,这个明白了,你看一下这个怎么解决:
有个非常奇怪的现象,如果是硬编码的下面这个strText变量,调试时鼠标移过去发现解成明文了,但是如果是变量的无法自动解成明文,这串unicode是一样的
CString strText(_T("\u5929\u7FFCe\u5BB6"));
这说明VC编译器“看懂”了\u5929\u7FFCe\u5BB6,把它转换成了宽字符。就好象把"\r\n"变成0a 0d
不懂怎么转了,下面的代码还是显示\u5929\u7FFCe\u5BB6, str是变量,值是\u5929\u7FFCe\u5BB6 ,
我的项目字符集是,多字节字符集的
char * pFileName = (char*)(LPCSTR)str;
USES_CONVERSION;
CString s = A2T(pFileName);
你这个是要做什么?如果要从宽字符转为多字节,使用WideCharToMultiByte
硬编码的时候VC编译器会负责转换,你用UE去搜索编译出来的exe文件,搜索二进制29 59 FC 7F,看看能不能搜得出来
我通过CHttpFile访问页面,然后返回的是unicode码的,现在我要将他转为明文,可我老是转换不成功,UE是编辑器吧,我搜索没找到
#17
为什么要这么补?
因为原本就是这样子的。你都知道这个是UNICODE的,是双字节字符,那些ASCII的字符自然要补上00。
我发现把\u5929\u7FFCe\u5BB6 UNICODE码通过
CString strText="\u5929\u7FFCe\u5BB6";//(_T("\u5929\u7FFCe\u5BB6"));
SetDlgItemText(IDC_EDIT4,strText);
这样在界面上显示的是已经解密的明文
#18
UE是UltraEdit,一种编辑工具,可以查看16进制内容,类似的有HexEdit。
现在你就做两步:
1、把字符串分组转换成真正的UNICODE编码
2、使用WideCharToMultiByte把宽字符转化成多字节集
现在你就做两步:
1、把字符串分组转换成真正的UNICODE编码
2、使用WideCharToMultiByte把宽字符转化成多字节集
#19
另外问一下你的VC是什么版本的,我在VC6.0下识别不出 \u 格式字符串。
#20
另外问一下你的VC是什么版本的,我在VC6.0下识别不出 \u 格式字符串。
vs2010
#21
UE是UltraEdit,一种编辑工具,可以查看16进制内容,类似的有HexEdit。
现在你就做两步:
1、把字符串分组转换成真正的UNICODE编码
2、使用WideCharToMultiByte把宽字符转化成多字节集
我死活转不出,你可以这样试,在程序上放个文本框,程序运行后粘贴这串下去\u5929\u7FFCe\u5BB6 ,
再通过程序获取文本框的值,就能测试转移是否成功了!
#22
获取文本框值后,再尝试转码,看能否成功,晚了,明天再试了!
#23
UE是UltraEdit,一种编辑工具,可以查看16进制内容,类似的有HexEdit。
现在你就做两步:
1、把字符串分组转换成真正的UNICODE编码
2、使用WideCharToMultiByte把宽字符转化成多字节集
我死活转不出,你可以这样试,在程序上放个文本框,程序运行后粘贴这串下去\u5929\u7FFCe\u5BB6 ,
再通过程序获取文本框的值,就能测试转移是否成功了!
你这样做就完全搞错了,你没有弄清楚转义字符的意思。
打个比方,我们都知道 在代码中'\\'表示\,'\t'表示制表符,这叫做转义字符。
可是你就不用在文本框中输入转义字符呀。你在文本款输入路径的时候不用输两个斜杠吧。
另外Unicode的字符转义可能是从2003开始支持,我在MSDN上找到了这个,你可以看一下
2.4.1 Unicode 字符转义序列
#24
UE是UltraEdit,一种编辑工具,可以查看16进制内容,类似的有HexEdit。
现在你就做两步:
1、把字符串分组转换成真正的UNICODE编码
2、使用WideCharToMultiByte把宽字符转化成多字节集
我死活转不出,你可以这样试,在程序上放个文本框,程序运行后粘贴这串下去\u5929\u7FFCe\u5BB6 ,
再通过程序获取文本框的值,就能测试转移是否成功了!
你这样做就完全搞错了,你没有弄清楚转义字符的意思。
打个比方,我们都知道 在代码中'\\'表示\,'\t'表示制表符,这叫做转义字符。
可是你就不用在文本框中输入转义字符呀。你在文本款输入路径的时候不用输两个斜杠吧。
另外Unicode的字符转义可能是从2003开始支持,我在MSDN上找到了这个,你可以看一下
2.4.1 Unicode 字符转义序列
嗯,用c不是很少,对这些字节转码之类的不是很深入弄懂,上面的unicode串如果硬编码存放到变量里面,再进入转码操作,无法测试是否转码成功,因为没进行转码操作之前编译器都已经帮你转好了明文,所以我才想到用这样的方法,要不然怎么测试
#25
还有人来吗
#26
你弄错很多东西,你用CHttpFile访问网页吧,大部分网页用的都是UTF-8的编码,你需要用MultiByteToWideChar将它转换为UTF-16(我想你一直说的Unicode肯定是它),再用WideCharToMultiByte将它转换为本地编码(C_ACP)
不要用CString充当BYTE数组,因为它依赖于编译设置。
你用编译器来试的方法是错误的,编译器只能生成ANSI或者Unicode(UTF-16)的硬编码,调试器也是只认识ANSI和UTF-16的字符串,CString的CStringA和CStringW也是对应的这两个。
不要用CString充当BYTE数组,因为它依赖于编译设置。
你用编译器来试的方法是错误的,编译器只能生成ANSI或者Unicode(UTF-16)的硬编码,调试器也是只认识ANSI和UTF-16的字符串,CString的CStringA和CStringW也是对应的这两个。
#27
void ConvertUtf8ToAnsi(const CStringA& strUtf8, CStringA& strAnsi)
{
int len=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0);
unsigned wchar_t * wszUnicode = new unsigned wchar_t[len+1];
memset(wszUnicode, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, wszUnicode, len);
len = WideCharToMultiByte(CP_ACP, 0, wszUnicode, -1, NULL, 0, NULL, NULL);
char *szAnsi=new char[len + 1];
memset(szAnsi, 0, len + 1);
WideCharToMultiByte (CP_ACP, 0, wszUnicode, -1, szAnsi, len, NULL,NULL);
strAnsi = szAnsi;
delete[] szAnsi;
delete[] wszUnicode;
}
#28
(LPCTSTR)strUtf8应该写成(LPCSTR)strUtf8
#29
int nCount = strText.Replace(_T("\\u"), _T(" 0x"));
wchar_t* buf = new wchar_t[nCount+1];
memset(buf, 0, sizeof(wchar_t)*(nCount+1));
int nIndex = 0;
TCHAR seps[] = _T(" ");
TCHAR* token = _tcstok(strText.GetBuffer(strText.GetLength()), seps);
while(NULL != token)
{
buf[nIndex++] = _tcstoul(token, NULL, 16);
token = _tcstok(NULL, seps);
}
strText.ReleaseBuffer();
CString strMulti;
int nSize = WideCharToMultiByte(CP_ACP,0,buf,nCount,NULL,0,NULL,NULL);
WideCharToMultiByte(CP_ACP,0,buf,nCount,strMulti.GetBuffer(nSize),nSize,NULL,NULL);
strMulti.ReleaseBuffer();
好吧,说老实话,我不太明白你究竟卡在哪一步了。其实你最开始的代码是可以用的,你只要在后面加上WideCharToMultiByte进行转换就可以了。不过我回第一个贴时没注意看代码,也没注意到你使用的是多字节字符集,可能误导了你。
#30
int nCount = strText.Replace(_T("\\u"), _T(" 0x"));
wchar_t* buf = new wchar_t[nCount+1];
memset(buf, 0, sizeof(wchar_t)*(nCount+1));
int nIndex = 0;
TCHAR seps[] = _T(" ");
TCHAR* token = _tcstok(strText.GetBuffer(strText.GetLength()), seps);
while(NULL != token)
{
buf[nIndex++] = _tcstoul(token, NULL, 16);
token = _tcstok(NULL, seps);
}
strText.ReleaseBuffer();
CString strMulti;
int nSize = WideCharToMultiByte(CP_ACP,0,buf,nCount,NULL,0,NULL,NULL);
WideCharToMultiByte(CP_ACP,0,buf,nCount,strMulti.GetBuffer(nSize),nSize,NULL,NULL);
strMulti.ReleaseBuffer();
好吧,说老实话,我不太明白你究竟卡在哪一步了。其实你最开始的代码是可以用的,你只要在后面加上WideCharToMultiByte进行转换就可以了。不过我回第一个贴时没注意看代码,也没注意到你使用的是多字节字符集,可能误导了你。
谢谢!
最后我通过vc调用javascript函数解决了,再次感谢!
#31
你弄错很多东西,你用CHttpFile访问网页吧,大部分网页用的都是UTF-8的编码,你需要用MultiByteToWideChar将它转换为UTF-16(我想你一直说的Unicode肯定是它),再用WideCharToMultiByte将它转换为本地编码(C_ACP)
不要用CString充当BYTE数组,因为它依赖于编译设置。
你用编译器来试的方法是错误的,编译器只能生成ANSI或者Unicode(UTF-16)的硬编码,调试器也是只认识ANSI和UTF-16的字符串,CString的CStringA和CStringW也是对应的这两个。
嗯,一直对编码这块了解不是很深,刚用vc不久,最后我通过vc调用javascript函数解决了,等下我试试你的方法,再次感谢!
#32
vc调用javascript函数,是怎么调用的,方法可以说说么?
#33
vc调用javascript函数,是怎么调用的,方法可以说说么?
网上有例子的,谷歌一下: vc 调用js
#34
大神问一下你是怎么解决的
#1
大侠快出招吧~
#2
把\u8f6c\u61\u7801\u62\u39\u8f6c\u21
补齐成
\u8f6c\u0061\u7801\u0062\u0039\u8f6c\u0021
补齐成
\u8f6c\u0061\u7801\u0062\u0039\u8f6c\u0021
#3
把\u8f6c\u61\u7801\u62\u39\u8f6c\u21
补齐成
\u8f6c\u0061\u7801\u0062\u0039\u8f6c\u0021
为何要被这样补,我是通过下面这个连接加密的
http://www.javawind.net/tools/native2ascii.jsp?action=transform
另外,各位,如果能用javascript解密也可以!
#4
为什么要这么补?
因为原本就是这样子的。你都知道这个是UNICODE的,是双字节字符,那些ASCII的字符自然要补上00。
因为原本就是这样子的。你都知道这个是UNICODE的,是双字节字符,那些ASCII的字符自然要补上00。
#5
use_conversion
T2A()
T2A()
#6
为什么要这么补?
因为原本就是这样子的。你都知道这个是UNICODE的,是双字节字符,那些ASCII的字符自然要补上00。
哦,明白了,谢谢!那怎么才能自动补上00呢
#7
use_conversion
T2A()
不会用T2A
#8
有个非常奇怪的现象,如果是硬编码的下面这个strText变量,调试时鼠标移过去发现解成明文了,但是如果是变量的无法自动解成明文,这串unicode是一样的
CString strText(_T("\u5929\u7FFCe\u5BB6"));
CString strText(_T("\u5929\u7FFCe\u5BB6"));
#9
为什么要这么补?
因为原本就是这样子的。你都知道这个是UNICODE的,是双字节字符,那些ASCII的字符自然要补上00。
哦,明白了,谢谢!那怎么才能自动补上00呢
你可以先拆分成子串 8f6c , 61,...
然后2个字节的就补上00。
或者就直接对子串转换,也不用补了。
#10
void XXX::ConvertGBKToUtf8(CString& strGBK)
{
int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
unsigned short * wszUtf8 = new unsigned short[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, (LPWSTR)wszUtf8, len);
len = WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)wszUtf8, -1, NULL, 0, NULL, NULL);
char *szUtf8=new char[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, (LPWSTR)wszUtf8, -1, szUtf8, len, NULL,NULL);
strGBK = szUtf8;
delete[] szUtf8;
delete[] wszUtf8;
}
绝对好用
{
int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
unsigned short * wszUtf8 = new unsigned short[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, (LPWSTR)wszUtf8, len);
len = WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)wszUtf8, -1, NULL, 0, NULL, NULL);
char *szUtf8=new char[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, (LPWSTR)wszUtf8, -1, szUtf8, len, NULL,NULL);
strGBK = szUtf8;
delete[] szUtf8;
delete[] wszUtf8;
}
绝对好用
#11
void XXX::ConvertGBKToUtf8(CString& strGBK)
{
int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);
unsigned short * wszUtf8 = new unsigned short[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, (LPWSTR)wszUtf8, len);
len = WideCharToMultiByte(CP_UTF8, 0, (LPWSTR)wszUtf8, -1, NULL, 0, NULL, NULL);
char *szUtf8=new char[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, (LPWSTR)wszUtf8, -1, szUtf8, len, NULL,NULL);
strGBK = szUtf8;
delete[] szUtf8;
delete[] wszUtf8;
}
绝对好用
不得,还是 UNICODE码,另外你看一下
有个非常奇怪的现象,如果是硬编码的下面这个strText变量,调试时鼠标移过去发现解成明文了,但是如果是变量的无法自动解成明文,这串unicode是一样的
CString strText(_T("\u5929\u7FFCe\u5BB6"));
#12
为什么要这么补?
因为原本就是这样子的。你都知道这个是UNICODE的,是双字节字符,那些ASCII的字符自然要补上00。
哦,明白了,谢谢!那怎么才能自动补上00呢
你可以先拆分成子串 8f6c , 61,...
然后2个字节的就补上00。
或者就直接对子串转换,也不用补了。
嗯,这个明白了,你看一下这个怎么解决:
有个非常奇怪的现象,如果是硬编码的下面这个strText变量,调试时鼠标移过去发现解成明文了,但是如果是变量的无法自动解成明文,这串unicode是一样的
CString strText(_T("\u5929\u7FFCe\u5BB6"));
#13
嗯,这个明白了,你看一下这个怎么解决:
有个非常奇怪的现象,如果是硬编码的下面这个strText变量,调试时鼠标移过去发现解成明文了,但是如果是变量的无法自动解成明文,这串unicode是一样的
CString strText(_T("\u5929\u7FFCe\u5BB6"));
这说明VC编译器“看懂”了\u5929\u7FFCe\u5BB6,把它转换成了宽字符。就好象把"\r\n"变成0a 0d
#14
嗯,这个明白了,你看一下这个怎么解决:
有个非常奇怪的现象,如果是硬编码的下面这个strText变量,调试时鼠标移过去发现解成明文了,但是如果是变量的无法自动解成明文,这串unicode是一样的
CString strText(_T("\u5929\u7FFCe\u5BB6"));
这说明VC编译器“看懂”了\u5929\u7FFCe\u5BB6,把它转换成了宽字符。就好象把"\r\n"变成0a 0d
不懂怎么转了,下面的代码还是显示\u5929\u7FFCe\u5BB6, str是变量,值是\u5929\u7FFCe\u5BB6 ,
我的项目字符集是,多字节字符集的
char * pFileName = (char*)(LPCSTR)str;
USES_CONVERSION;
CString s = A2T(pFileName);
#15
嗯,这个明白了,你看一下这个怎么解决:
有个非常奇怪的现象,如果是硬编码的下面这个strText变量,调试时鼠标移过去发现解成明文了,但是如果是变量的无法自动解成明文,这串unicode是一样的
CString strText(_T("\u5929\u7FFCe\u5BB6"));
这说明VC编译器“看懂”了\u5929\u7FFCe\u5BB6,把它转换成了宽字符。就好象把"\r\n"变成0a 0d
不懂怎么转了,下面的代码还是显示\u5929\u7FFCe\u5BB6, str是变量,值是\u5929\u7FFCe\u5BB6 ,
我的项目字符集是,多字节字符集的
char * pFileName = (char*)(LPCSTR)str;
USES_CONVERSION;
CString s = A2T(pFileName);
你这个是要做什么?如果要从宽字符转为多字节,使用WideCharToMultiByte
硬编码的时候VC编译器会负责转换,你用UE去搜索编译出来的exe文件,搜索二进制29 59 FC 7F,看看能不能搜得出来
#16
嗯,这个明白了,你看一下这个怎么解决:
有个非常奇怪的现象,如果是硬编码的下面这个strText变量,调试时鼠标移过去发现解成明文了,但是如果是变量的无法自动解成明文,这串unicode是一样的
CString strText(_T("\u5929\u7FFCe\u5BB6"));
这说明VC编译器“看懂”了\u5929\u7FFCe\u5BB6,把它转换成了宽字符。就好象把"\r\n"变成0a 0d
不懂怎么转了,下面的代码还是显示\u5929\u7FFCe\u5BB6, str是变量,值是\u5929\u7FFCe\u5BB6 ,
我的项目字符集是,多字节字符集的
char * pFileName = (char*)(LPCSTR)str;
USES_CONVERSION;
CString s = A2T(pFileName);
你这个是要做什么?如果要从宽字符转为多字节,使用WideCharToMultiByte
硬编码的时候VC编译器会负责转换,你用UE去搜索编译出来的exe文件,搜索二进制29 59 FC 7F,看看能不能搜得出来
我通过CHttpFile访问页面,然后返回的是unicode码的,现在我要将他转为明文,可我老是转换不成功,UE是编辑器吧,我搜索没找到
#17
为什么要这么补?
因为原本就是这样子的。你都知道这个是UNICODE的,是双字节字符,那些ASCII的字符自然要补上00。
我发现把\u5929\u7FFCe\u5BB6 UNICODE码通过
CString strText="\u5929\u7FFCe\u5BB6";//(_T("\u5929\u7FFCe\u5BB6"));
SetDlgItemText(IDC_EDIT4,strText);
这样在界面上显示的是已经解密的明文
#18
UE是UltraEdit,一种编辑工具,可以查看16进制内容,类似的有HexEdit。
现在你就做两步:
1、把字符串分组转换成真正的UNICODE编码
2、使用WideCharToMultiByte把宽字符转化成多字节集
现在你就做两步:
1、把字符串分组转换成真正的UNICODE编码
2、使用WideCharToMultiByte把宽字符转化成多字节集
#19
另外问一下你的VC是什么版本的,我在VC6.0下识别不出 \u 格式字符串。
#20
另外问一下你的VC是什么版本的,我在VC6.0下识别不出 \u 格式字符串。
vs2010
#21
UE是UltraEdit,一种编辑工具,可以查看16进制内容,类似的有HexEdit。
现在你就做两步:
1、把字符串分组转换成真正的UNICODE编码
2、使用WideCharToMultiByte把宽字符转化成多字节集
我死活转不出,你可以这样试,在程序上放个文本框,程序运行后粘贴这串下去\u5929\u7FFCe\u5BB6 ,
再通过程序获取文本框的值,就能测试转移是否成功了!
#22
获取文本框值后,再尝试转码,看能否成功,晚了,明天再试了!
#23
UE是UltraEdit,一种编辑工具,可以查看16进制内容,类似的有HexEdit。
现在你就做两步:
1、把字符串分组转换成真正的UNICODE编码
2、使用WideCharToMultiByte把宽字符转化成多字节集
我死活转不出,你可以这样试,在程序上放个文本框,程序运行后粘贴这串下去\u5929\u7FFCe\u5BB6 ,
再通过程序获取文本框的值,就能测试转移是否成功了!
你这样做就完全搞错了,你没有弄清楚转义字符的意思。
打个比方,我们都知道 在代码中'\\'表示\,'\t'表示制表符,这叫做转义字符。
可是你就不用在文本框中输入转义字符呀。你在文本款输入路径的时候不用输两个斜杠吧。
另外Unicode的字符转义可能是从2003开始支持,我在MSDN上找到了这个,你可以看一下
2.4.1 Unicode 字符转义序列
#24
UE是UltraEdit,一种编辑工具,可以查看16进制内容,类似的有HexEdit。
现在你就做两步:
1、把字符串分组转换成真正的UNICODE编码
2、使用WideCharToMultiByte把宽字符转化成多字节集
我死活转不出,你可以这样试,在程序上放个文本框,程序运行后粘贴这串下去\u5929\u7FFCe\u5BB6 ,
再通过程序获取文本框的值,就能测试转移是否成功了!
你这样做就完全搞错了,你没有弄清楚转义字符的意思。
打个比方,我们都知道 在代码中'\\'表示\,'\t'表示制表符,这叫做转义字符。
可是你就不用在文本框中输入转义字符呀。你在文本款输入路径的时候不用输两个斜杠吧。
另外Unicode的字符转义可能是从2003开始支持,我在MSDN上找到了这个,你可以看一下
2.4.1 Unicode 字符转义序列
嗯,用c不是很少,对这些字节转码之类的不是很深入弄懂,上面的unicode串如果硬编码存放到变量里面,再进入转码操作,无法测试是否转码成功,因为没进行转码操作之前编译器都已经帮你转好了明文,所以我才想到用这样的方法,要不然怎么测试
#25
还有人来吗
#26
你弄错很多东西,你用CHttpFile访问网页吧,大部分网页用的都是UTF-8的编码,你需要用MultiByteToWideChar将它转换为UTF-16(我想你一直说的Unicode肯定是它),再用WideCharToMultiByte将它转换为本地编码(C_ACP)
不要用CString充当BYTE数组,因为它依赖于编译设置。
你用编译器来试的方法是错误的,编译器只能生成ANSI或者Unicode(UTF-16)的硬编码,调试器也是只认识ANSI和UTF-16的字符串,CString的CStringA和CStringW也是对应的这两个。
不要用CString充当BYTE数组,因为它依赖于编译设置。
你用编译器来试的方法是错误的,编译器只能生成ANSI或者Unicode(UTF-16)的硬编码,调试器也是只认识ANSI和UTF-16的字符串,CString的CStringA和CStringW也是对应的这两个。
#27
void ConvertUtf8ToAnsi(const CStringA& strUtf8, CStringA& strAnsi)
{
int len=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0);
unsigned wchar_t * wszUnicode = new unsigned wchar_t[len+1];
memset(wszUnicode, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, wszUnicode, len);
len = WideCharToMultiByte(CP_ACP, 0, wszUnicode, -1, NULL, 0, NULL, NULL);
char *szAnsi=new char[len + 1];
memset(szAnsi, 0, len + 1);
WideCharToMultiByte (CP_ACP, 0, wszUnicode, -1, szAnsi, len, NULL,NULL);
strAnsi = szAnsi;
delete[] szAnsi;
delete[] wszUnicode;
}
#28
(LPCTSTR)strUtf8应该写成(LPCSTR)strUtf8
#29
int nCount = strText.Replace(_T("\\u"), _T(" 0x"));
wchar_t* buf = new wchar_t[nCount+1];
memset(buf, 0, sizeof(wchar_t)*(nCount+1));
int nIndex = 0;
TCHAR seps[] = _T(" ");
TCHAR* token = _tcstok(strText.GetBuffer(strText.GetLength()), seps);
while(NULL != token)
{
buf[nIndex++] = _tcstoul(token, NULL, 16);
token = _tcstok(NULL, seps);
}
strText.ReleaseBuffer();
CString strMulti;
int nSize = WideCharToMultiByte(CP_ACP,0,buf,nCount,NULL,0,NULL,NULL);
WideCharToMultiByte(CP_ACP,0,buf,nCount,strMulti.GetBuffer(nSize),nSize,NULL,NULL);
strMulti.ReleaseBuffer();
好吧,说老实话,我不太明白你究竟卡在哪一步了。其实你最开始的代码是可以用的,你只要在后面加上WideCharToMultiByte进行转换就可以了。不过我回第一个贴时没注意看代码,也没注意到你使用的是多字节字符集,可能误导了你。
#30
int nCount = strText.Replace(_T("\\u"), _T(" 0x"));
wchar_t* buf = new wchar_t[nCount+1];
memset(buf, 0, sizeof(wchar_t)*(nCount+1));
int nIndex = 0;
TCHAR seps[] = _T(" ");
TCHAR* token = _tcstok(strText.GetBuffer(strText.GetLength()), seps);
while(NULL != token)
{
buf[nIndex++] = _tcstoul(token, NULL, 16);
token = _tcstok(NULL, seps);
}
strText.ReleaseBuffer();
CString strMulti;
int nSize = WideCharToMultiByte(CP_ACP,0,buf,nCount,NULL,0,NULL,NULL);
WideCharToMultiByte(CP_ACP,0,buf,nCount,strMulti.GetBuffer(nSize),nSize,NULL,NULL);
strMulti.ReleaseBuffer();
好吧,说老实话,我不太明白你究竟卡在哪一步了。其实你最开始的代码是可以用的,你只要在后面加上WideCharToMultiByte进行转换就可以了。不过我回第一个贴时没注意看代码,也没注意到你使用的是多字节字符集,可能误导了你。
谢谢!
最后我通过vc调用javascript函数解决了,再次感谢!
#31
你弄错很多东西,你用CHttpFile访问网页吧,大部分网页用的都是UTF-8的编码,你需要用MultiByteToWideChar将它转换为UTF-16(我想你一直说的Unicode肯定是它),再用WideCharToMultiByte将它转换为本地编码(C_ACP)
不要用CString充当BYTE数组,因为它依赖于编译设置。
你用编译器来试的方法是错误的,编译器只能生成ANSI或者Unicode(UTF-16)的硬编码,调试器也是只认识ANSI和UTF-16的字符串,CString的CStringA和CStringW也是对应的这两个。
嗯,一直对编码这块了解不是很深,刚用vc不久,最后我通过vc调用javascript函数解决了,等下我试试你的方法,再次感谢!
#32
vc调用javascript函数,是怎么调用的,方法可以说说么?
#33
vc调用javascript函数,是怎么调用的,方法可以说说么?
网上有例子的,谷歌一下: vc 调用js
#34
大神问一下你是怎么解决的