vc 将Unicode码转换成中文

时间:2021-08-24 20:15:12
我的项目字符集是多字节项目的

\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


大侠快出招吧~ vc 将Unicode码转换成中文

#2


把\u8f6c\u61\u7801\u62\u39\u8f6c\u21 
补齐成
\u8f6c\u0061\u7801\u0062\u0039\u8f6c\u0021 

#3


引用 2 楼 FireBurn 的回复:
把\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。

#5


use_conversion

T2A()

#6


引用 4 楼 FireBurn 的回复:
为什么要这么补?
因为原本就是这样子的。你都知道这个是UNICODE的,是双字节字符,那些ASCII的字符自然要补上00。


哦,明白了,谢谢!那怎么才能自动补上00呢

#7


引用 5 楼 zyyoung 的回复:
use_conversion

T2A()



不会用T2A

#8


有个非常奇怪的现象,如果是硬编码的下面这个strText变量,调试时鼠标移过去发现解成明文了,但是如果是变量的无法自动解成明文,这串unicode是一样的
CString strText(_T("\u5929\u7FFCe\u5BB6"));

#9


引用 6 楼 java123object 的回复:
Quote: 引用 4 楼 FireBurn 的回复:

为什么要这么补?
因为原本就是这样子的。你都知道这个是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; 


绝对好用

#11


引用 10 楼 wny198816 的回复:
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


引用 9 楼 FireBurn 的回复:
Quote: 引用 6 楼 java123object 的回复:

Quote: 引用 4 楼 FireBurn 的回复:

为什么要这么补?
因为原本就是这样子的。你都知道这个是UNICODE的,是双字节字符,那些ASCII的字符自然要补上00。


哦,明白了,谢谢!那怎么才能自动补上00呢

你可以先拆分成子串 8f6c , 61,...
然后2个字节的就补上00。
或者就直接对子串转换,也不用补了。


嗯,这个明白了,你看一下这个怎么解决:

有个非常奇怪的现象,如果是硬编码的下面这个strText变量,调试时鼠标移过去发现解成明文了,但是如果是变量的无法自动解成明文,这串unicode是一样的
CString strText(_T("\u5929\u7FFCe\u5BB6"));
 

#13


引用 12 楼 java123object 的回复:
嗯,这个明白了,你看一下这个怎么解决:

有个非常奇怪的现象,如果是硬编码的下面这个strText变量,调试时鼠标移过去发现解成明文了,但是如果是变量的无法自动解成明文,这串unicode是一样的
CString strText(_T("\u5929\u7FFCe\u5BB6"));
 

这说明VC编译器“看懂”了\u5929\u7FFCe\u5BB6,把它转换成了宽字符。就好象把"\r\n"变成0a 0d

#14


引用 13 楼 FireBurn 的回复:
Quote: 引用 12 楼 java123object 的回复:

嗯,这个明白了,你看一下这个怎么解决:

有个非常奇怪的现象,如果是硬编码的下面这个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


引用 14 楼 java123object 的回复:
Quote: 引用 13 楼 FireBurn 的回复:

Quote: 引用 12 楼 java123object 的回复:

嗯,这个明白了,你看一下这个怎么解决:

有个非常奇怪的现象,如果是硬编码的下面这个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


引用 15 楼 FireBurn 的回复:
Quote: 引用 14 楼 java123object 的回复:

Quote: 引用 13 楼 FireBurn 的回复:

Quote: 引用 12 楼 java123object 的回复:

嗯,这个明白了,你看一下这个怎么解决:

有个非常奇怪的现象,如果是硬编码的下面这个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


引用 4 楼 FireBurn 的回复:
为什么要这么补?
因为原本就是这样子的。你都知道这个是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把宽字符转化成多字节集

#19


另外问一下你的VC是什么版本的,我在VC6.0下识别不出 \u 格式字符串。

#20


引用 19 楼 FireBurn 的回复:
另外问一下你的VC是什么版本的,我在VC6.0下识别不出 \u 格式字符串。


vs2010

#21


引用 18 楼 FireBurn 的回复:
UE是UltraEdit,一种编辑工具,可以查看16进制内容,类似的有HexEdit。

现在你就做两步:
1、把字符串分组转换成真正的UNICODE编码
2、使用WideCharToMultiByte把宽字符转化成多字节集


我死活转不出,你可以这样试,在程序上放个文本框,程序运行后粘贴这串下去\u5929\u7FFCe\u5BB6 ,
再通过程序获取文本框的值,就能测试转移是否成功了!

#22


获取文本框值后,再尝试转码,看能否成功,晚了,明天再试了!

#23


引用 21 楼 java123object 的回复:
Quote: 引用 18 楼 FireBurn 的回复:

UE是UltraEdit,一种编辑工具,可以查看16进制内容,类似的有HexEdit。

现在你就做两步:
1、把字符串分组转换成真正的UNICODE编码
2、使用WideCharToMultiByte把宽字符转化成多字节集


我死活转不出,你可以这样试,在程序上放个文本框,程序运行后粘贴这串下去\u5929\u7FFCe\u5BB6 ,
再通过程序获取文本框的值,就能测试转移是否成功了!

你这样做就完全搞错了,你没有弄清楚转义字符的意思。

打个比方,我们都知道 在代码中'\\'表示\,'\t'表示制表符,这叫做转义字符。

可是你就不用在文本框中输入转义字符呀。你在文本款输入路径的时候不用输两个斜杠吧。

另外Unicode的字符转义可能是从2003开始支持,我在MSDN上找到了这个,你可以看一下
2.4.1 Unicode 字符转义序列

#24


引用 23 楼 FireBurn 的回复:
Quote: 引用 21 楼 java123object 的回复:

Quote: 引用 18 楼 FireBurn 的回复:

UE是UltraEdit,一种编辑工具,可以查看16进制内容,类似的有HexEdit。

现在你就做两步:
1、把字符串分组转换成真正的UNICODE编码
2、使用WideCharToMultiByte把宽字符转化成多字节集


我死活转不出,你可以这样试,在程序上放个文本框,程序运行后粘贴这串下去\u5929\u7FFCe\u5BB6 ,
再通过程序获取文本框的值,就能测试转移是否成功了!

你这样做就完全搞错了,你没有弄清楚转义字符的意思。

打个比方,我们都知道 在代码中'\\'表示\,'\t'表示制表符,这叫做转义字符。

可是你就不用在文本框中输入转义字符呀。你在文本款输入路径的时候不用输两个斜杠吧。

另外Unicode的字符转义可能是从2003开始支持,我在MSDN上找到了这个,你可以看一下
2.4.1 Unicode 字符转义序列


嗯,用c不是很少,对这些字节转码之类的不是很深入弄懂,上面的unicode串如果硬编码存放到变量里面,再进入转码操作,无法测试是否转码成功,因为没进行转码操作之前编译器都已经帮你转好了明文,所以我才想到用这样的方法,要不然怎么测试

#25


还有人来吗 vc 将Unicode码转换成中文

#26


你弄错很多东西,你用CHttpFile访问网页吧,大部分网页用的都是UTF-8的编码,你需要用MultiByteToWideChar将它转换为UTF-16(我想你一直说的Unicode肯定是它),再用WideCharToMultiByte将它转换为本地编码(C_ACP)
不要用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


引用 29 楼 FireBurn 的回复:

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


引用 26 楼 Bokutake 的回复:
你弄错很多东西,你用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


引用 32 楼 yhjd1234 的回复:
vc调用javascript函数,是怎么调用的,方法可以说说么?


网上有例子的,谷歌一下: vc 调用js

#34


大神问一下你是怎么解决的

#1


大侠快出招吧~ vc 将Unicode码转换成中文

#2


把\u8f6c\u61\u7801\u62\u39\u8f6c\u21 
补齐成
\u8f6c\u0061\u7801\u0062\u0039\u8f6c\u0021 

#3


引用 2 楼 FireBurn 的回复:
把\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。

#5


use_conversion

T2A()

#6


引用 4 楼 FireBurn 的回复:
为什么要这么补?
因为原本就是这样子的。你都知道这个是UNICODE的,是双字节字符,那些ASCII的字符自然要补上00。


哦,明白了,谢谢!那怎么才能自动补上00呢

#7


引用 5 楼 zyyoung 的回复:
use_conversion

T2A()



不会用T2A

#8


有个非常奇怪的现象,如果是硬编码的下面这个strText变量,调试时鼠标移过去发现解成明文了,但是如果是变量的无法自动解成明文,这串unicode是一样的
CString strText(_T("\u5929\u7FFCe\u5BB6"));

#9


引用 6 楼 java123object 的回复:
Quote: 引用 4 楼 FireBurn 的回复:

为什么要这么补?
因为原本就是这样子的。你都知道这个是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; 


绝对好用

#11


引用 10 楼 wny198816 的回复:
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


引用 9 楼 FireBurn 的回复:
Quote: 引用 6 楼 java123object 的回复:

Quote: 引用 4 楼 FireBurn 的回复:

为什么要这么补?
因为原本就是这样子的。你都知道这个是UNICODE的,是双字节字符,那些ASCII的字符自然要补上00。


哦,明白了,谢谢!那怎么才能自动补上00呢

你可以先拆分成子串 8f6c , 61,...
然后2个字节的就补上00。
或者就直接对子串转换,也不用补了。


嗯,这个明白了,你看一下这个怎么解决:

有个非常奇怪的现象,如果是硬编码的下面这个strText变量,调试时鼠标移过去发现解成明文了,但是如果是变量的无法自动解成明文,这串unicode是一样的
CString strText(_T("\u5929\u7FFCe\u5BB6"));
 

#13


引用 12 楼 java123object 的回复:
嗯,这个明白了,你看一下这个怎么解决:

有个非常奇怪的现象,如果是硬编码的下面这个strText变量,调试时鼠标移过去发现解成明文了,但是如果是变量的无法自动解成明文,这串unicode是一样的
CString strText(_T("\u5929\u7FFCe\u5BB6"));
 

这说明VC编译器“看懂”了\u5929\u7FFCe\u5BB6,把它转换成了宽字符。就好象把"\r\n"变成0a 0d

#14


引用 13 楼 FireBurn 的回复:
Quote: 引用 12 楼 java123object 的回复:

嗯,这个明白了,你看一下这个怎么解决:

有个非常奇怪的现象,如果是硬编码的下面这个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


引用 14 楼 java123object 的回复:
Quote: 引用 13 楼 FireBurn 的回复:

Quote: 引用 12 楼 java123object 的回复:

嗯,这个明白了,你看一下这个怎么解决:

有个非常奇怪的现象,如果是硬编码的下面这个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


引用 15 楼 FireBurn 的回复:
Quote: 引用 14 楼 java123object 的回复:

Quote: 引用 13 楼 FireBurn 的回复:

Quote: 引用 12 楼 java123object 的回复:

嗯,这个明白了,你看一下这个怎么解决:

有个非常奇怪的现象,如果是硬编码的下面这个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


引用 4 楼 FireBurn 的回复:
为什么要这么补?
因为原本就是这样子的。你都知道这个是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把宽字符转化成多字节集

#19


另外问一下你的VC是什么版本的,我在VC6.0下识别不出 \u 格式字符串。

#20


引用 19 楼 FireBurn 的回复:
另外问一下你的VC是什么版本的,我在VC6.0下识别不出 \u 格式字符串。


vs2010

#21


引用 18 楼 FireBurn 的回复:
UE是UltraEdit,一种编辑工具,可以查看16进制内容,类似的有HexEdit。

现在你就做两步:
1、把字符串分组转换成真正的UNICODE编码
2、使用WideCharToMultiByte把宽字符转化成多字节集


我死活转不出,你可以这样试,在程序上放个文本框,程序运行后粘贴这串下去\u5929\u7FFCe\u5BB6 ,
再通过程序获取文本框的值,就能测试转移是否成功了!

#22


获取文本框值后,再尝试转码,看能否成功,晚了,明天再试了!

#23


引用 21 楼 java123object 的回复:
Quote: 引用 18 楼 FireBurn 的回复:

UE是UltraEdit,一种编辑工具,可以查看16进制内容,类似的有HexEdit。

现在你就做两步:
1、把字符串分组转换成真正的UNICODE编码
2、使用WideCharToMultiByte把宽字符转化成多字节集


我死活转不出,你可以这样试,在程序上放个文本框,程序运行后粘贴这串下去\u5929\u7FFCe\u5BB6 ,
再通过程序获取文本框的值,就能测试转移是否成功了!

你这样做就完全搞错了,你没有弄清楚转义字符的意思。

打个比方,我们都知道 在代码中'\\'表示\,'\t'表示制表符,这叫做转义字符。

可是你就不用在文本框中输入转义字符呀。你在文本款输入路径的时候不用输两个斜杠吧。

另外Unicode的字符转义可能是从2003开始支持,我在MSDN上找到了这个,你可以看一下
2.4.1 Unicode 字符转义序列

#24


引用 23 楼 FireBurn 的回复:
Quote: 引用 21 楼 java123object 的回复:

Quote: 引用 18 楼 FireBurn 的回复:

UE是UltraEdit,一种编辑工具,可以查看16进制内容,类似的有HexEdit。

现在你就做两步:
1、把字符串分组转换成真正的UNICODE编码
2、使用WideCharToMultiByte把宽字符转化成多字节集


我死活转不出,你可以这样试,在程序上放个文本框,程序运行后粘贴这串下去\u5929\u7FFCe\u5BB6 ,
再通过程序获取文本框的值,就能测试转移是否成功了!

你这样做就完全搞错了,你没有弄清楚转义字符的意思。

打个比方,我们都知道 在代码中'\\'表示\,'\t'表示制表符,这叫做转义字符。

可是你就不用在文本框中输入转义字符呀。你在文本款输入路径的时候不用输两个斜杠吧。

另外Unicode的字符转义可能是从2003开始支持,我在MSDN上找到了这个,你可以看一下
2.4.1 Unicode 字符转义序列


嗯,用c不是很少,对这些字节转码之类的不是很深入弄懂,上面的unicode串如果硬编码存放到变量里面,再进入转码操作,无法测试是否转码成功,因为没进行转码操作之前编译器都已经帮你转好了明文,所以我才想到用这样的方法,要不然怎么测试

#25


还有人来吗 vc 将Unicode码转换成中文

#26


你弄错很多东西,你用CHttpFile访问网页吧,大部分网页用的都是UTF-8的编码,你需要用MultiByteToWideChar将它转换为UTF-16(我想你一直说的Unicode肯定是它),再用WideCharToMultiByte将它转换为本地编码(C_ACP)
不要用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


引用 29 楼 FireBurn 的回复:

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


引用 26 楼 Bokutake 的回复:
你弄错很多东西,你用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


引用 32 楼 yhjd1234 的回复:
vc调用javascript函数,是怎么调用的,方法可以说说么?


网上有例子的,谷歌一下: vc 调用js

#34


大神问一下你是怎么解决的