zoukankan
html css js c++ java
C/C++ 字符编码的转换(ut8、gb2312)
//
这是个类strCoding (strCoding.h文件)
#pragma once
#include
<
iostream
>
#include
<
string
>
#include
<
windows.h
>
using
namespace
std;
class
strCoding
{
public
:
strCoding(
void
);
~
strCoding(
void
);
void
UTF_8ToGB2312(
string
&
pOut,
char
*
pText,
int
pLen);
//
utf_8转为gb2312
void
GB2312ToUTF_8(
string
&
pOut,
char
*
pText,
int
pLen);
//
gb2312 转utf_8
string
UrlGB2312(
char
*
str);
//
urlgb2312编码
string
UrlUTF8(
char
*
str);
//
urlutf8 编码
string
UrlUTF8Decode(
string
str);
//
urlutf8解码
string
UrlGB2312Decode(
string
str);
//
urlgb2312解码
private
:
void
Gb2312ToUnicode(WCHAR
*
pOut,
char
*
gbBuffer);
void
UTF_8ToUnicode(WCHAR
*
pOut,
char
*
pText);
void
UnicodeToUTF_8(
char
*
pOut,WCHAR
*
pText);
void
UnicodeToGB2312(
char
*
pOut,WCHAR uData);
char
CharToInt(
char
ch);
char
StrToBin(
char
*
str);
}
;
//
这是个类strCoding (strCoding.cpp文件)
#include
"
StdAfx.h
"
#include
"
.\strcoding.h
"
strCoding::strCoding(
void
)
{
}
strCoding::
~
strCoding(
void
)
{
}
void
strCoding::Gb2312ToUnicode(WCHAR
*
pOut,
char
*
gbBuffer)
{
::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,
2
,pOut,
1
);
return
;
}
void
strCoding::UTF_8ToUnicode(WCHAR
*
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
strCoding::UnicodeToUTF_8(
char
*
pOut,WCHAR
*
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
strCoding::UnicodeToGB2312(
char
*
pOut,WCHAR uData)
{
WideCharToMultiByte(CP_ACP,NULL,
&
uData,
1
,pOut,
sizeof
(WCHAR),NULL,NULL);
return
;
}
//
做为解Url使用
char
strCoding:: CharToInt(
char
ch)
{
if
(ch
>=
'
0
'
&&
ch
<=
'
9
'
)
return
(
char
)(ch
-
'
0
'
);
if
(ch
>=
'
a
'
&&
ch
<=
'
f
'
)
return
(
char
)(ch
-
'
a
'
+
10
);
if
(ch
>=
'
A
'
&&
ch
<=
'
F
'
)
return
(
char
)(ch
-
'
A
'
+
10
);
return
-
1
;
}
char
strCoding::StrToBin(
char
*
str)
{
char
tempWord[
2
];
char
chn;
tempWord[
0
]
=
CharToInt(str[
0
]);
//
make the B to 11 -- 00001011
tempWord[
1
]
=
CharToInt(str[
1
]);
//
make the 0 to 0 -- 00000000
chn
=
(tempWord[
0
]
<<
4
)
|
tempWord[
1
];
//
to change the BO to 10110000
return
chn;
}
//
UTF_8 转gb2312
void
strCoding::UTF_8ToGB2312(
string
&
pOut,
char
*
pText,
int
pLen)
{
char
buf[
4
];
char
*
rst
=
new
char
[pLen
+
(pLen
>>
2
)
+
2
];
memset(buf,
0
,
4
);
memset(rst,
0
,pLen
+
(pLen
>>
2
)
+
2
);
int
i
=
0
;
int
j
=
0
;
while
(i
<
pLen)
{
if
(
*
(pText
+
i)
>=
0
)
{
rst[j
++
]
=
pText[i
++
];
}
else
{
WCHAR Wtemp;
UTF_8ToUnicode(
&
Wtemp,pText
+
i);
UnicodeToGB2312(buf,Wtemp);
unsigned
short
int
tmp
=
0
;
tmp
=
rst[j]
=
buf[
0
];
tmp
=
rst[j
+
1
]
=
buf[
1
];
tmp
=
rst[j
+
2
]
=
buf[
2
];
//
newBuf[j] = Ctemp[0];
//
newBuf[j + 1] = Ctemp[1];
i
+=
3
;
j
+=
2
;
}
}
rst[j]
=
'
\0
'
;
pOut
=
rst;
delete []rst;
}
//
GB2312 转为 UTF-8
void
strCoding::GB2312ToUTF_8(
string
&
pOut,
char
*
pText,
int
pLen)
{
char
buf[
4
];
memset(buf,
0
,
4
);
pOut.clear();
int
i
=
0
;
while
(i
<
pLen)
{
//
如果是英文直接复制就可以
if
( pText[i]
>=
0
)
{
char
asciistr[
2
]
=
{
0
}
;
asciistr[
0
]
=
(pText[i
++
]);
pOut.append(asciistr);
}
else
{
WCHAR pbuffer;
Gb2312ToUnicode(
&
pbuffer,pText
+
i);
UnicodeToUTF_8(buf,
&
pbuffer);
pOut.append(buf);
i
+=
2
;
}
}
return
;
}
//
把str编码为网页中的 GB2312 url encode ,英文不变,汉字双字节 如%3D%AE%88
string
strCoding::UrlGB2312(
char
*
str)
{
string
dd;
size_t len
=
strlen(str);
for
(size_t i
=
0
;i
<
len;i
++
)
{
if
(isalnum((BYTE)str[i]))
{
char
tempbuff[
2
];
sprintf(tempbuff,
"
%c
"
,str[i]);
dd.append(tempbuff);
}
else
if
(isspace((BYTE)str[i]))
{
dd.append(
"
+
"
);
}
else
{
char
tempbuff[
4
];
sprintf(tempbuff,
"
%%%X%X
"
,((BYTE
*
)str)[i]
>>
4
,((BYTE
*
)str)[i]
%
16
);
dd.append(tempbuff);
}
}
return
dd;
}
//
把str编码为网页中的 UTF-8 url encode ,英文不变,汉字三字节 如%3D%AE%88
string
strCoding::UrlUTF8(
char
*
str)
{
string
tt;
string
dd;
GB2312ToUTF_8(tt,str,(
int
)strlen(str));
size_t len
=
tt.length();
for
(size_t i
=
0
;i
<
len;i
++
)
{
if
(isalnum((BYTE)tt.at(i)))
{
char
tempbuff[
2
]
=
{
0
}
;
sprintf(tempbuff,
"
%c
"
,(BYTE)tt.at(i));
dd.append(tempbuff);
}
else
if
(isspace((BYTE)tt.at(i)))
{
dd.append(
"
+
"
);
}
else
{
char
tempbuff[
4
];
sprintf(tempbuff,
"
%%%X%X
"
,((BYTE)tt.at(i))
>>
4
,((BYTE)tt.at(i))
%
16
);
dd.append(tempbuff);
}
}
return
dd;
}
//
把url GB2312解码
string
strCoding::UrlGB2312Decode(
string
str)
{
string
output
=
""
;
char
tmp[
2
];
int
i
=
0
,idx
=
0
,ndx,len
=
str.length();
while
(i
<
len)
{
if
(str[i]
==
'
%
'
)
{
tmp[
0
]
=
str[i
+
1
];
tmp[
1
]
=
str[i
+
2
];
output
+=
StrToBin(tmp);
i
=
i
+
3
;
}
else
if
(str[i]
==
'
+
'
)
{
output
+=
'
'
;
i
++
;
}
else
{
output
+=
str[i];
i
++
;
}
}
return
output;
}
//
把url utf8解码
string
strCoding::UrlUTF8Decode(
string
str)
{
string
output
=
""
;
string
temp
=
UrlGB2312Decode(str);
//
UTF_8ToGB2312(output,(
char
*
)temp.data(),strlen(temp.data()));
return
output;
}
//
test
#include
"
stdafx.h
"
#include
"
strCoding.h
"
using
namespace
std;
int
main()
{
strCoding cfm;
string
keyword
=
"
大家好,欢迎你
"
;
string
Temp
=
""
;
string
Output
=
""
;
//
把关键字做url的utf8编码
Temp
=
cfm.UrlUTF8((
char
*
)keyword.data());
cout
<<
Temp
<<
endl;
//
把url的utf8编码的结果解码
Temp
=
cfm.UrlUTF8Decode(Temp);
cout
<<
Temp
<<
endl;
//
把关键字做url的gb2312编码
Temp
=
cfm.UrlGB2312((
char
*
)keyword.data());
cout
<<
Temp
<<
endl;
//
把url的gb2312编码的结果解码
Temp
=
cfm.UrlGB2312Decode(Temp);
cout
<<
Temp
<<
endl;
//
把关键字GB2312转UTF_8
cfm.GB2312ToUTF_8(Output,(
char
*
)keyword.data(),strlen(keyword.data()));
cout
<<
Output
<<
endl;
//
把GB2312转UTF_8转为中文
cfm.UTF_8ToGB2312(Temp,(
char
*
)Output.data(),strlen(Output.data()));
cout
<<
Temp
<<
endl;
//
system("pasue");
getchar();
return
0
;
//
}
在VC7win32下调试通过
查看全文
相关阅读:
Python学习-字符编码浅析
python元组,集合类型,及字典补充
python字符串,列表常用操作
python流程控制
Python之线程&进程
yii框架的中的一些使用介绍
《最牛B的Linux Shell命令》笔记
CentOS6.8上安装epel
mysql 5.7 Group Replication
mysql5.7 参数记录 (持续更新)
原文地址:https://www.cnblogs.com/cfam/p/835301.html
最新文章
Python【每日一问】02
Python【每日一问】01
xcode10下,Build Phases下没有Embed Frameworks
Jquery mobile动态生成ListView调用刷新方法报错
VsCode运行 Html 页面到浏览器
Sql Server2008如何让外网访问自己的数据库
回车符和换行符区别
静态类(C#)
SQL Server中存储过程的创建命令
利用网线建立两台电脑的连接进行文件传输
热门文章
Sql Server登录失败问题
数组字符串
关于调用百度地图api在自己写的网页中实现和解决在https中正常显示
怎样在github里面写个人主页
怎样使用github
关于前端的交互 ajax
jquery实现图片轮播
python-函数入门(二)
python-函数入门(一)
python-文件的基本操作
Copyright © 2011-2022 走看看