社区
C++ 语言
帖子详情
c/c++编码转换(从GB2312编码转变为UNICODE编码)
liferecorder
2009-06-10 02:11:25
在windows下运行,从GB2312编码转变为UNICODE编码的C/C++标准函数是什么?
其具体的调用方式,即包含头文件是什么。最好举个例。并简单解释参数的意思。
...全文
2030
26
打赏
收藏
c/c++编码转换(从GB2312编码转变为UNICODE编码)
在windows下运行,从GB2312编码转变为UNICODE编码的C/C++标准函数是什么? 其具体的调用方式,即包含头文件是什么。最好举个例。并简单解释参数的意思。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
c/
c++
采用
编码
转换
表实现gbk与
unicode
互转
c/
c++
采用
编码
转换
表实现gbk与
unicode
互转,文件内含有两个
编码
大矩阵, 采用
unicode
小端模式,程序简单易懂
GB2312
编码
和UTF-8互转(c语言实现)
GB2312
编码
与utf-8
编码
的字符串的
转换
,主要使用windows api函数MultiByteToWideChar和WideCharToMultiByte,代码简洁,经测试可用
《C语言/
C++
学习指南》Linux开发篇
本篇面向Linux初级、但已掌握C/
C++
基本语法的学员,以CentOS为演示平台,介绍Linux下的C/
C++
开发技术。在内容编排上,先介绍Linux的安装、基本使用和配置,然后再开始介绍在Linux下的C/
C++
开发技术: gcc命令行、Makefile、gdb调试方法、动态库与静态库、pthread线程、进程、进程间通信、系统调用及杂项技术。(前四章免费)
c语言利用
编码
转换
表实现gbk与
unicode
互转
c语言利用
编码
转换
表实现gbk与
unicode
互转
VC/
C++
字符
编码
格式
转换
通过调用封装API函数WideCharToMultiByte和MultiByteToWideChar,实现ANSI/UTF-8/
Unicode
编码
格式的相互
转换
。有
C++
和C两个版本。
C++ 语言
64,662
社区成员
250,488
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章