c/c++编码转换(从GB2312编码转变为UNICODE编码)

liferecorder 2009-06-10 02:11:25
在windows下运行,从GB2312编码转变为UNICODE编码的C/C++标准函数是什么?

其具体的调用方式,即包含头文件是什么。最好举个例。并简单解释参数的意思。
...全文
2030 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
moon2008moon 2009-06-12
  • 打赏
  • 举报
回复
是把字符转换后再保存到原来的变量里
liferecorder 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 moon2008moon 的回复:]

void lingo_util::ConvertACPToUtf8(CString& strACP)
{
int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strACP, -1, NULL,0);
unsigned short * wszUtf8 = new unsigned short[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strACP, -1, (LPWSTR)wszUtf8, len);
len = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, NULL, 0, NULL, NULL);
char *szUtf8=new…
[/Quote]

你这两个函数实现思路是怎么样的,那个变量存储的是Unicode的值?
moon2008moon 2009-06-12
  • 打赏
  • 举报
回复

void lingo_util::ConvertACPToUtf8(CString& strACP)
{
int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strACP, -1, NULL,0);
unsigned short * wszUtf8 = new unsigned short[len+1];
memset(wszUtf8, 0, len * 2 + 2);
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strACP, -1, (LPWSTR)wszUtf8, len);
len = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, NULL, 0, NULL, NULL);
char *szUtf8=new char[len + 1];
memset(szUtf8, 0, len + 1);
WideCharToMultiByte (CP_UTF8, 0, (LPCWSTR)wszUtf8, -1, szUtf8, len, NULL,NULL);
strACP = szUtf8;
delete[] szUtf8;
delete[] wszUtf8;
}
void lingo_util::ConvertUtf8ToACP(CString& strUtf8)
{
//////////////////////////////////////////////////////////////////////////
// utf8的 BOM头。(Byte-order mark )
// 0xefbbbf.
//
if(byte(strUtf8[0]) == 0xef && byte(strUtf8[1]) == 0xbb && byte(strUtf8[2]) == 0xbf)
{
strUtf8 = strUtf8.Mid(3);
}
int len=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0);
unsigned short * wszACP = new unsigned short[len+1];
memset(wszACP, 0, len * 2 + 2);
MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, (LPWSTR)wszACP, len);
len = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)wszACP, -1, NULL, 0, NULL, NULL);
char *szACP=new char[len + 1];
memset(szACP, 0, len + 1);
WideCharToMultiByte (CP_ACP, 0, (LPCWSTR)wszACP, -1, szACP, len, NULL,NULL);
strUtf8 = szACP;
delete[] szACP;
delete[] wszACP;
}


liferecorder 2009-06-12
  • 打赏
  • 举报
回复
太感谢了!!
moon2008moon 2009-06-12
  • 打赏
  • 举报
回复
void ConvertACPToUtf8(char strACP[],wchar_t strUtf8[])
{
int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strACP, -1, NULL,0);
MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strACP, -1, (LPWSTR)strUtf8, len*2+2);
}

int main()
{

char buffer[] = "一";
printf("%x\n",'一');
wchar_t szText[10];
ConvertACPToUtf8(buffer,szText);
int a = *(szText);
printf("%x\n",a);
}
liferecorder 2009-06-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 liferecorder 的帖子:]
在windows下运行,从GB2312编码转变为UNICODE编码的C/C++标准函数是什么?

其具体的调用方式,即包含头文件是什么。最好举个例。并简单解释参数的意思。
[/Quote]

在网上查了下,MultiByteToWideChar函数的使用,但是无法实现我说的将一个汉字的编码转换为Unicode码啊,
如汉字“一”,其GB2312编码是D2BB,对应的Unicode码是4E00.
我试了两种情况1:char *sText="一"; 输出结果为空;2:char *sText="D2BB"; 输出一样的D2BB. 我要怎么得到4E00.
难道真的没办法吗????~~~~~·
性能侠客行 2009-06-11
  • 打赏
  • 举报
回复
MultiByteToWideChar
liferecorder 2009-06-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 moon2008moon 的回复:]
#include <windows.h>
#include <lm.h>
#include <stdio.h>

BOOL GetFullName( char *UserName, char *Domain, char *dest )
{
WCHAR wszUserName[UNLEN+1]; // Unicode user name
WCHAR wszDomain[256];
LPBYTE ComputerName;

struct _SERVER_INFO_100 *si100; // Server structure
struct _USER_INFO_2 *ui; // User structure

// Convert ANSI user name and…
[/Quote]


不太清楚那些参数到底是什么用,我查过msdn(全英文的,不是很明白),这个东西会出现个对话框什么的。。我就想简单点,只要从运行窗口中输入一个汉字就可以了。
liferecorder 2009-06-11
  • 打赏
  • 举报
回复
我要急着实现这个东西,而一时好难去学习api mfc。。。呜呜~~
liferecorder 2009-06-11
  • 打赏
  • 举报
回复
补充一下:我具体想实现的是将输入的"一个汉字"转换为一"个Unicode编码(16进制的4位数)",并将这个编码存储到一个变量中

你们这些乐于助人的高手们知道的话就提供具体点的帮助吧。不胜感激!!!!
JackLam 2009-06-11
  • 打赏
  • 举报
回复
能不能弄个可以在任何操作系统下通用的,不要用WIN API 或者LINUX API
nightcat168 2009-06-11
  • 打赏
  • 举报
回复
GB2312编码转变为UNICODE编码使用MultiByteToWideChar

char *buf = "GB2312编码转变为UNICODE编码使用MultiByteToWideChar";
int nWcharLen = lstrlenA(buf)+1;
BSTR unicodestr = SysAllocStringLen(NULL, 2*nWcharLen);
MultiByteToWideChar(CP_ACP, 0, buf, nWcharLen, unicodestr, nWcharLen);
//SysFreeString(unicodestr);
fallening 2009-06-11
  • 打赏
  • 举报
回复
iconv -f gb2312 -t utf8 filename > newfilename
draculamx 2009-06-11
  • 打赏
  • 举报
回复
C 和 C++ 的标准库中好像没有楼主要的函数吧。。。

你可以使用:
1.win32 API
2.MFC
liferecorder 2009-06-11
  • 打赏
  • 举报
回复
先谢谢各位了.我去实践下,到时给你们加分.
liferecorder 2009-06-11
  • 打赏
  • 举报
回复
#include<windows.h>
#include<iostream>
#include<string>
using namespace std;
void main()
{
char *sText="一";

DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, sText, -1, NULL, 0);
wchar_t *pwText;
pwText = new wchar_t[dwNum];
if(!pwText)
{
delete []pwText;
}
MultiByteToWideChar (CP_ACP, 0, sText, -1, pwText, dwNum);


cout<<dwNum<<endl;
wcout<<pwText<<endl;

delete []pwText;
}

————————————————————————————————————
在网上查了下,MultiByteToWideChar函数的使用,但是无法实现我说的将一个汉字的编码转换为Unicode码啊,
如汉字“一”,其GB2312编码是D2BB,对应的Unicode码是4E00.
我试了两种情况1:char *sText="一"; 输出结果为空;2:char *sText="D2BB"; 输出一样的D2BB. 我要怎么得到4E00.
难道真的没办法吗????~~~~~·
liferecorder 2009-06-11
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 tdjdyq 的回复:]
class CChineseCode
{
public:
static void UTF_8ToUnicode(wchar_t* pOut,char *pText); // 把UTF-8转换成Unicode
static void UnicodeToUTF_8(char* pOut,wchar_t* pText); //Unicode 转换成UTF-8
static void UnicodeToGB2312(char* pOut,wchar_t uData); // 把Unicode 转换成 GB2312
static void Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer);// GB2312 转换成 Unicode

[/Quote]

我前不久查到过,但运行的时候出了些错误,加上对"MultiByteToWideChar函数"的不熟悉,不知道具体怎么改。不过我还是觉得有点麻烦,这样的方式好像要通过对话框传输数据。。
void CChineseCode::Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer)
{
::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);
return ;
}

这函数返回空值,如果我想用个变量存储 得到的 Unicode值,我要怎么办?。。。

等待着答案。。。。。
liferecorder 2009-06-11
  • 打赏
  • 举报
回复
我把几组编码发上来
汉字----GB2312--Unicode
一 D2BB 4E00
丁 B6A1 4E01
丂 8140 4E02
七 C6DF 4E03
丄 8141 4E04
丅 8142 4E05
丆 8143 4E06
万 CDF2 4E07
丈 D5C9 4E08
——————————————————————————————————————————
11楼的提到
——————————————————
GB2312编码转变为UNICODE编码使用MultiByteToWideChar

char *buf = "GB2312编码转变为UNICODE编码使用MultiByteToWideChar";
int nWcharLen = lstrlenA(buf)+1;
BSTR unicodestr = SysAllocStringLen(NULL, 2*nWcharLen);
MultiByteToWideChar(CP_ACP, 0, buf, nWcharLen, unicodestr, nWcharLen);
//SysFreeString(unicodestr);


——————————————————————————
#include<windows.h>
#include<iostream>
#include<string>
#include<cstring>
using namespace std;

void main()
{
char *buf = "一";
int nWcharLen = lstrlenA(buf)+1;
BSTR unicodestr = SysAllocStringLen(NULL, 2*nWcharLen); //我不知道bstr是什么类型,就在前头引用了一堆头文件。。。谁来解释下:BSTR是什么?
MultiByteToWideChar(CP_ACP, 0, buf, nWcharLen, unicodestr, nWcharLen); //还有这个函数返回值是什么?是得到的unicodestr的长度值?

cout<<"unicodestr:"<<unicodestr<<endl;
cout<<"*unicodestr:"<<*unicodestr<<endl;
cout<<"buf:"<<buf<<endl;

}
运行后输出结果是
unicodestr:00146D44
*unicodestr:19968
buf:一

谁能解释一下unicodestr,*unicodestr什么意思。
——————————————————————————————
再声明一次
::::::我具体想实现的是将输入的"一个汉字"转换为一"个Unicode编码(16进制的4位数)",并将这个编码存储到一个变量中。

你们这些乐于助人的高手们知道的话就提供具体点的帮助吧。不胜感激!!!!
tdjdyq 2009-06-11
  • 打赏
  • 举报
回复
class CChineseCode
{
public:
static void UTF_8ToUnicode(wchar_t* pOut,char *pText); // 把UTF-8转换成Unicode
static void UnicodeToUTF_8(char* pOut,wchar_t* pText); //Unicode 转换成UTF-8
static void UnicodeToGB2312(char* pOut,wchar_t uData); // 把Unicode 转换成 GB2312
static void Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer);// GB2312 转换成 Unicode
static void GB2312ToUTF_8(string& pOut,char *pText, int pLen);//GB2312 转为 UTF-8
static void UTF_8ToGB2312(string &pOut, char *pText, int pLen);//UTF-8 转为 GB2312
};

类实现

void CChineseCode::UTF_8ToUnicode(wchar_t* pOut,char *pText)
{
char* uchar = (char *)pOut;

uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);
uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F);

return;
}

void CChineseCode::UnicodeToUTF_8(char* pOut,wchar_t* pText)
{
// 注意 WCHAR高低字的顺序,低字节在前,高字节在后
char* pchar = (char *)pText;

pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));
pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);
pOut[2] = (0x80 | (pchar[0] & 0x3F));

return;
}

void CChineseCode::UnicodeToGB2312(char* pOut,wchar_t uData)
{
WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(wchar_t),NULL,NULL);
return;
}

void CChineseCode::Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer)
{
::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);
return ;
}

void CChineseCode::GB2312ToUTF_8(string& pOut,char *pText, int pLen)
{
char buf[4];
int nLength = pLen* 3;
char* rst = new char[nLength];

memset(buf,0,4);
memset(rst,0,nLength);

int i = 0;
int j = 0;
while(i < pLen)
{
//如果是英文直接复制就能
if( *(pText + i) >= 0)
{
rst[j++] = pText[i++];
}
else
{
wchar_t pbuffer;
Gb2312ToUnicode(&pbuffer,pText+i);

UnicodeToUTF_8(buf,&pbuffer);

unsigned short int tmp = 0;
tmp = rst[j] = buf[0];
tmp = rst[j+1] = buf[1];
tmp = rst[j+2] = buf[2];

j += 3;
i += 2;
}
}
rst[j] = ’’;

//返回结果
pOut = rst;
delete []rst;

return;
}

void CChineseCode::UTF_8ToGB2312(string &pOut, char *pText, int pLen)
{
char * newBuf = new char[pLen];
char Ctemp[4];
memset(Ctemp,0,4);

int i =0;
int j = 0;

while(i < pLen)
{
if(pText > 0)
{
newBuf[j++] = pText[i++];
}
else
{
WCHAR Wtemp;
UTF_8ToUnicode(&Wtemp,pText + i);

UnicodeToGB2312(Ctemp,Wtemp);

newBuf[j] = Ctemp[0];
newBuf[j + 1] = Ctemp[1];

i += 3;
j += 2;
}
}
newBuf[j] = ’’;

pOut = newBuf;
delete []newBuf;

return;
}
moon2008moon 2009-06-10
  • 打赏
  • 举报
回复
#include <windows.h>
#include <lm.h>
#include <stdio.h>

BOOL GetFullName( char *UserName, char *Domain, char *dest )
{
WCHAR wszUserName[UNLEN+1]; // Unicode user name
WCHAR wszDomain[256];
LPBYTE ComputerName;

struct _SERVER_INFO_100 *si100; // Server structure
struct _USER_INFO_2 *ui; // User structure

// Convert ANSI user name and domain to Unicode

MultiByteToWideChar( CP_ACP, 0, UserName,
strlen(UserName)+1, wszUserName,
sizeof(wszUserName)/sizeof(wszUserName[0]) );
MultiByteTOWideChar( CP_ACP, 0, Domain,
strlen(Domain)+1, wszDomain, sizeof(wszDomain)/sizeof(wszDomain[0]) );

// Get the computer name of a DC for the domain.

NetGetDCName( NULL, wszDomain, &ComputerName );

// Look up the user on the DC.

if( NetUserGetInfo( (LPWSTR) ComputerName,
(LPWSTR) &wszUserName, 2, (LPBYTE *) &ui ) )
{
printf( "Error getting user information.\n" );
return( FALSE );
}

// Convert the Unicode full name to ANSI.

WideCharToMultiByte( CP_ACP, 0, ui->usri2_full_name, -1,
dest, 256, NULL, NULL );

return (TRUE);
}
加载更多回复(6)

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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