utf8转gbk问题

hqulyc 2007-06-09 11:38:30
void CChartsetManager::convertGBKToUtf8(CString& strGBK)
{
USES_CONVERSION;
int nLen = MultiByteToWideChar(CP_ACP, 0, W2A((LPCTSTR)strGBK), -1, NULL,0);

wchar_t *wszUtf8 = new wchar_t[nLen+1];
memset(wszUtf8, 0, (nLen+1)*sizeof(wchar_t));
MultiByteToWideChar(CP_ACP, 0, W2A((LPCTSTR)strGBK), -1, wszUtf8, nLen);

nLen = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL);

char *szUtf8=new char[nLen+1];
memset(szUtf8, 0, nLen+1);
WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, szUtf8, nLen, NULL,NULL);

strGBK = szUtf8;
delete[] szUtf8;
delete[] wszUtf8;
}

void CChartsetManager::convertUtf8ToGBK(CString& strUtf8)
{
USES_CONVERSION;
int nLen = MultiByteToWideChar(CP_UTF8, 0, W2A((LPCTSTR)strUtf8), -1, NULL,0);
wchar_t *wszGBK = new wchar_t[nLen+1];
memset(wszGBK, 0, (nLen+1)*sizeof(wchar_t));
MultiByteToWideChar(CP_UTF8, 0, W2A((LPCTSTR)strUtf8), -1, wszGBK, nLen);

nLen = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);
char *szGBK=new char[nLen+1];
memset(szGBK, 0, nLen+1);
WideCharToMultiByte (CP_ACP, 0, wszGBK, -1, szGBK, nLen, NULL,NULL);

strUtf8 = szGBK;
delete[] szGBK;
delete[] wszGBK;
}

这个是两个我gbk和utf8转换的函数,gbk转utf8能转换正确。但utf8转换gbk当汉字为奇数时候,utf8码转换为gbk,会少掉一个字。

一个gbk为2个字节,而utf8为3个字节,当转换的utf8为奇数字节时候,如何才能正确转换为gbk码?
...全文
8604 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
没再非中文体统上做测试
不过,我猜测是自适应的根据系统默认的代码页.,猜测而已.
hqulyc 2007-06-15
  • 打赏
  • 举报
回复
To:akirya(坏[其实偶不是什么所谓的坏人])
To:unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回)
那是不是我的代码页如果是gbk的话,还要将用户输入的再先转成ansi?


  • 打赏
  • 举报
回复
CodePage
[in] Specifies the code page to be used to perform the conversion. This parameter can be given the value of any code page that is installed or available in the system. You can also specify one of the values shown in the following table. Value Meaning
CP_ACP ANSI code page
CP_MACCP Macintosh code page
CP_OEMCP OEM code page
CP_SYMBOL Windows 2000/XP: Symbol code page (42)
CP_THREAD_ACP Windows 2000/XP: The current thread's ANSI code page
CP_UTF7 Windows 98/Me, Windows NT 4.0 and later: Translate using UTF-7
CP_UTF8 Windows 98/Me, Windows NT 4.0 and later: Translate using UTF-8.

CP_ACP 是ansi不是gbk
僵哥 2007-06-15
  • 打赏
  • 举报
回复
怎么我发现那多人都直接把CP_ACP代码页当成是GBK相对应的代码页?如果当前的系统设置默认的不是简体中文呢?比如说繁体,甚至是英文或者日文...
  • 打赏
  • 举报
回复
:) 可以
hqulyc 2007-06-15
  • 打赏
  • 举报
回复
ok,thanks!~
有问题我可以发消息给你?
谢了!
  • 打赏
  • 举报
回复
呵呵,通常情况是不会影响的.检查一下你的代码吧
hqulyc 2007-06-15
  • 打赏
  • 举报
回复
靠,我将转换的数据放入一个edit,不知道是不是这个问题导致的。
  • 打赏
  • 举报
回复
我的也是vs2005
#include<windows.h>
#include<vector>
#include<iostream>
using namespace std;

int AToUtf8(LPCSTR pASCIIBuf,LPSTR pUtf8Buf=NULL)
{

DWORD UniCodeLen=MultiByteToWideChar(CP_ACP, 0, pASCIIBuf, -1, 0, 0);
std::vector<wchar_t> vWCH(UniCodeLen);
MultiByteToWideChar(CP_ACP, 0, pASCIIBuf, -1, &vWCH[0], UniCodeLen);
DWORD dwUtf8Len=WideCharToMultiByte(CP_UTF8, 0, &vWCH[0], UniCodeLen , NULL, NULL, NULL, NULL );
if (NULL==pUtf8Buf)
return dwUtf8Len;
return WideCharToMultiByte(CP_UTF8, 0, &vWCH[0], UniCodeLen , pUtf8Buf, dwUtf8Len, NULL, NULL );
}
int Utf8ToA(LPCSTR pUtf8Buf,LPSTR pASCIIBuf =NULL)
{

DWORD UniCodeLen=MultiByteToWideChar(CP_UTF8, 0, pUtf8Buf, -1, NULL,0 );
std::vector<wchar_t> vWCH(UniCodeLen);
MultiByteToWideChar(CP_UTF8, 0, pUtf8Buf, -1, &vWCH[0] , UniCodeLen );
DWORD dwASCIILen=WideCharToMultiByte(CP_ACP, 0, &vWCH[0], UniCodeLen , NULL ,NULL , NULL, NULL );
if (NULL==pASCIIBuf)
return dwASCIILen;
return WideCharToMultiByte(CP_ACP, 0, &vWCH[0], UniCodeLen , pASCIIBuf, dwASCIILen, NULL, NULL );
}

int main(int ,char* [])
{
char sz[]="中";
int x = AToUtf8( sz );
char* putf8 = new char[x];
memset(putf8,0,x);
AToUtf8( sz , putf8 );
cout<<putf8<<endl;

int y = Utf8ToA( putf8 );
char* pascii = new char[y];
memset(pascii,0 , y);
Utf8ToA(putf8 , pascii );
cout<<pascii<<endl;
delete putf8;
delete pascii;
return 0;
}
hqulyc 2007-06-15
  • 打赏
  • 举报
回复
我的是在vs2005下测试的,你的?
可以把你的gbk转utf8也贴出来吗?
thanks
  • 打赏
  • 举报
回复
你把你的测试数据贴出来看看
  • 打赏
  • 举报
回复
可以啊,你的不行?
hqulyc 2007-06-15
  • 打赏
  • 举报
回复
楼上的单个汉字可以正常互换?
  • 打赏
  • 举报
回复
这个编码转换的东西我一直用的
const char* pUtf8Buf = ......utf 8编码;
DWORD UniCodeLen=MultiByteToWideChar(CP_UTF8, 0, pUtf8Buf, -1, NULL,0 );
std::vector<wchar_t> vWCH(UniCodeLen);
MultiByteToWideChar(CP_UTF8, 0, pUtf8Buf, -1, &vWCH[0] , UniCodeLen );
DWORD dwASCIILen=WideCharToMultiByte(CP_ACP, 0, &vWCH[0], UniCodeLen , NULL ,NULL , NULL, NULL );
std::vector<char> vAscii( dwASCIILen );
WideCharToMultiByte(CP_ACP, 0, &vWCH[0], UniCodeLen , &vAscii[0], dwASCIILen, NULL, NULL );
printf("%s\n",&vAscii[0]);
hqulyc 2007-06-15
  • 打赏
  • 举报
回复
在顶顶,
lixiaosan 2007-06-12
  • 打赏
  • 举报
回复
http://www.vckbase.com/document/viewdoc/?id=1397
hqulyc 2007-06-12
  • 打赏
  • 举报
回复
自己顶下,问题还没能解决啊!
hqulyc 2007-06-12
  • 打赏
  • 举报
回复
TO:lixiaosan(小三) ( ) 信誉:148 Blog 加为好友 2007-6-12 11:41:41 得分: 0
http://www.vckbase.com/document/viewdoc/?id=1397
它的转换有点问题。


hqulyc 2007-06-11
  • 打赏
  • 举报
回复
to:akirya(坏[其实偶不是什么所谓的坏人])
转换长度这个我知道,只是望你在看下我的题目,thanks!
hqulyc 2007-06-11
  • 打赏
  • 举报
回复
To:huzs_82(cFan.hu) ,CathySun118(斯年)
我的问题是一个汉字转换为的utf8码,在转换过去就转不了了,你的可以转换成功吗?
就是当utf8吗为奇数字节的话,不知道是否要补上一个字节或是什么,才能转换正确?

ps:我是在vs2005下测试的。
加载更多回复(5)

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧