1. c/c++ base64编码后的内容为:
$base64_encode="IMf9tq/G9yBEINbQtcS+7crHIExFTk9WTwogvu21xNDywdC6xcrHIDU4N0EtOTcyNgoKIEQ6XHdvcmtcZnVodWFcc29rZXRfMl92Mlxzb2tldF8yILXExL/CvAoKMjAxOC8wOC8zMSAgMTc6MjAgICAgPERJUj4gICAgICAgICAgLgoyMDE4LzA4LzMxICAxNzoyMCAgICA8RElSPiAgICAgICAgICAuLgoyMDE4LzA4LzMxICAxNzoyNiAgICAgICAgICAgICAyLDgyNiBiYXNlNjQuY3BwCjIwMTgvMDgvMzEgIDE3OjI2ICAgICAgICAgICAgICAgMTUxIGJhc2U2NC5oCjIwMTgvMDkvMDMgIDE2OjIyICAgIDxESVI+ICAgICAgICAgIERlYnVnCjIwMTgvMDgvMTQgIDA5OjM3ICAgICAgICAgICAgIDEsNTUzIFJlYWRNZS50eHQKMjAxOC8wOC8zMSAgMDk6NTUgICAgPERJUj4gICAgICAgICAgUmVsZWFzZQoyMDE4LzA4LzMxICAxNzoyOCAgICAgICAgICAgICA0LDQ0OSBzb2tldF8yLnZjeHByb2oKMjAxOC8wOC8zMSAgMTc6MjggICAgICAgICAgICAgMSw0OTQgc29rZXRfMi52Y3hwcm9qLmZpbHRlcnMKMjAxOC8wOC8xNCAgMDk6MzcgICAgICAgICAgICAgICAxNDMgc29rZXRfMi52Y3hwcm9qLnVzZXIKMjAxOC8wOS8wMyAgMTY6MTkgICAgICAgICAgICAgOCw0MzAgc29rZXRfY2xpZW50LmNwcAoyMDE4LzA4LzE0ICAwOTozNyAgICAgICAgICAgICAgIDIxMiBzdGRhZnguY3BwCjIwMTgvMDgvMTQgIDA5OjM3ICAgICAgICAgICAgICAgMjMzIHN0ZGFmeC5oCjIwMTgvMDgvMTQgIDA5OjM3ICAgICAgICAgICAgICAgMjM2IHRhcmdldHZlci5oCjIwMTEvMDUvMTQgIDE5OjI0ICAgICAgICAgICAgIDgsMTk4IHRpbnlzdHIuaAoyMDExLzA1LzE0ICAxOToyNCAgICAgICAgICAgIDY0LDgzNCB0aW55eG1sLmgKICAgICAgICAgICAgICAxMiC49s7EvP4gICAgICAgICA5Miw3NTkg19a92gogICAgICAgICAgICAgICA0ILj2xL/CvCA5NywxMjMsMDkwLDQzMiC/ydPD19a92go=";
通过c/c++进行base64解码,也没有出现中文乱码问题,但是用Php解码后,在网页上显示中文就乱码了。
2. 通过fiddler或者网上在线base64解码发现,解码后中文也是乱码的:
������ D �еľ��� LENOVO
�������� 587A-9726
D:\work\fuhua\soket_2_v2\soket_2 ��Ŀ¼
2018/08/31 17:20 <DIR> .
2018/08/31 17:20 <DIR> ..
2018/08/31 17:26 2,826 base64.cpp
2018/08/31 17:26 151 base64.h
2018/09/03 16:22 <DIR> Debug
2018/08/14 09:37 1,553 ReadMe.txt
2018/08/31 09:55 <DIR> Release
2018/08/31 17:28 4,449 soket_2.vcxproj
2018/08/31 17:28 1,494 soket_2.vcxproj.filters
2018/08/14 09:37 143 soket_2.vcxproj.user
2018/09/03 16:19 8,430 soket_client.cpp
2018/08/14 09:37 212 stdafx.cpp
2018/08/14 09:37 233 stdafx.h
2018/08/14 09:37 236 targetver.h
2011/05/14 19:24 8,198 tinystr.h
2011/05/14 19:24 64,834 tinyxml.h
12 ���ļ� 92,759 �ֽ�
4 ��Ŀ¼ 97,123,090,432 �����ֽ�
3. 解决办法如下(php编写),通过如下函数进行转换:
function decode($text)
{
define('UTF32_BIG_ENDIAN_BOM', chr(0x00) . chr(0x00) . chr(0xFE) . chr(0xFF));
define('UTF32_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE) . chr(0x00) . chr(0x00));
define('UTF16_BIG_ENDIAN_BOM', chr(0xFE) . chr(0xFF));
define('UTF16_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE));
define('UTF8_BOM', chr(0xEF) . chr(0xBB) . chr(0xBF));
$first2 = substr($text, 0, 2);
$first3 = substr($text, 0, 3);
$first4 = substr($text, 0, 3);
$encodType = "";
if ($first3 == UTF8_BOM)
$encodType = 'UTF-8 BOM';
else if ($first4 == UTF32_BIG_ENDIAN_BOM)
$encodType = 'UTF-32BE';
else if ($first4 == UTF32_LITTLE_ENDIAN_BOM)
$encodType = 'UTF-32LE';
else if ($first2 == UTF16_BIG_ENDIAN_BOM)
$encodType = 'UTF-16BE';
else if ($first2 == UTF16_LITTLE_ENDIAN_BOM)
$encodType = 'UTF-16LE';
//下面的判断主要还是判断ANSI编码的·
if ($encodType == '') {//即默认创建的txt文本-ANSI编码的
$content = iconv("GBK", "UTF-8", $text);
} else if ($encodType == 'UTF-8 BOM') {//本来就是UTF-8不用转换
$content = $text;
} else {//其他的格式都转化为UTF-8就可以了
$content = iconv($encodType, "UTF-8", $text);
}
return $content;
}
转码后,中文显示正常了,结果如下图:
4. 附上全部测试代码:
<?php
$base64_encode="IMf9tq/G9yBEINbQtcS+7crHIExFTk9WTwogvu21xNDywdC6xcrHIDU4N0EtOTcyNgoKIEQ6XHdvcmtcZnVodWFcc29rZXRfMl92Mlxzb2tldF8yILXExL/CvAoKMjAxOC8wOC8zMSAgMTc6MjAgICAgPERJUj4gICAgICAgICAgLgoyMDE4LzA4LzMxICAxNzoyMCAgICA8RElSPiAgICAgICAgICAuLgoyMDE4LzA4LzMxICAxNzoyNiAgICAgICAgICAgICAyLDgyNiBiYXNlNjQuY3BwCjIwMTgvMDgvMzEgIDE3OjI2ICAgICAgICAgICAgICAgMTUxIGJhc2U2NC5oCjIwMTgvMDkvMDMgIDE2OjIyICAgIDxESVI+ICAgICAgICAgIERlYnVnCjIwMTgvMDgvMTQgIDA5OjM3ICAgICAgICAgICAgIDEsNTUzIFJlYWRNZS50eHQKMjAxOC8wOC8zMSAgMDk6NTUgICAgPERJUj4gICAgICAgICAgUmVsZWFzZQoyMDE4LzA4LzMxICAxNzoyOCAgICAgICAgICAgICA0LDQ0OSBzb2tldF8yLnZjeHByb2oKMjAxOC8wOC8zMSAgMTc6MjggICAgICAgICAgICAgMSw0OTQgc29rZXRfMi52Y3hwcm9qLmZpbHRlcnMKMjAxOC8wOC8xNCAgMDk6MzcgICAgICAgICAgICAgICAxNDMgc29rZXRfMi52Y3hwcm9qLnVzZXIKMjAxOC8wOS8wMyAgMTY6MTkgICAgICAgICAgICAgOCw0MzAgc29rZXRfY2xpZW50LmNwcAoyMDE4LzA4LzE0ICAwOTozNyAgICAgICAgICAgICAgIDIxMiBzdGRhZnguY3BwCjIwMTgvMDgvMTQgIDA5OjM3ICAgICAgICAgICAgICAgMjMzIHN0ZGFmeC5oCjIwMTgvMDgvMTQgIDA5OjM3ICAgICAgICAgICAgICAgMjM2IHRhcmdldHZlci5oCjIwMTEvMDUvMTQgIDE5OjI0ICAgICAgICAgICAgIDgsMTk4IHRpbnlzdHIuaAoyMDExLzA1LzE0ICAxOToyNCAgICAgICAgICAgIDY0LDgzNCB0aW55eG1sLmgKICAgICAgICAgICAgICAxMiC49s7EvP4gICAgICAgICA5Miw3NTkg19a92gogICAgICAgICAgICAgICA0ILj2xL/CvCA5NywxMjMsMDkwLDQzMiC/ydPD19a92go=";
$result=base_decode($base64_encode);
var_dump($result);
function base_decode($encode_str)
{
$base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
$ret="";
$in_len = strlen($encode_str);
$i = 0;
$j = 0;
$in_ = 0;
$char_array_4=array();
$char_array_3=array();
while($in_<$in_len)
{
$char_array_4[$i++]=$encode_str[$in_];
$in_++;
if($i==4)
{
for ($i = 0; $i <4; $i++)
{
$char_array_4[$i] = strpos($base64_chars,$char_array_4[$i]);
}
$char_array_3[0] = ($char_array_4[0] << 2) + (($char_array_4[1] & 0x30) >> 4);
$char_array_3[1] = (($char_array_4[1] & 0xf) << 4) + (($char_array_4[2] & 0x3c) >> 2);
$char_array_3[2] = (($char_array_4[2] & 0x3) << 6) + $char_array_4[3];
for ($i = 0; $i < 3; $i++)
{
$ret.=chr($char_array_3[$i]);
}
$i = 0;
}
}
if($i)
{
for ($j = $i; $j <4; $j++)
{
$char_array_4[$j] = 0;
}
for ($j = 0; $j <4; $j++)
{
$char_array_4[$j] = strpos($base64_chars,$char_array_4[$j]);
}
$char_array_3[0] = ($char_array_4[0] << 2) + (($char_array_4[1] & 0x30) >> 4);
$char_array_3[1] = (($char_array_4[1] & 0xf) << 4) + (($char_array_4[2] & 0x3c) >> 2);
$char_array_3[2] = (($char_array_4[2] & 0x3) << 6) + $char_array_4[3];
for ($j = 0; ($j < $i - 1); $j++)
{
$ret.=chr($char_array_3[$j]);
}
}
$ret1=decode($ret);
return $ret1;
}
function decode($text)
{
define('UTF32_BIG_ENDIAN_BOM', chr(0x00) . chr(0x00) . chr(0xFE) . chr(0xFF));
define('UTF32_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE) . chr(0x00) . chr(0x00));
define('UTF16_BIG_ENDIAN_BOM', chr(0xFE) . chr(0xFF));
define('UTF16_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE));
define('UTF8_BOM', chr(0xEF) . chr(0xBB) . chr(0xBF));
$first2 = substr($text, 0, 2);
$first3 = substr($text, 0, 3);
$first4 = substr($text, 0, 3);
$encodType = "";
if ($first3 == UTF8_BOM)
$encodType = 'UTF-8 BOM';
else if ($first4 == UTF32_BIG_ENDIAN_BOM)
$encodType = 'UTF-32BE';
else if ($first4 == UTF32_LITTLE_ENDIAN_BOM)
$encodType = 'UTF-32LE';
else if ($first2 == UTF16_BIG_ENDIAN_BOM)
$encodType = 'UTF-16BE';
else if ($first2 == UTF16_LITTLE_ENDIAN_BOM)
$encodType = 'UTF-16LE';
//下面的判断主要还是判断ANSI编码的·
if ($encodType == '') {//即默认创建的txt文本-ANSI编码的
$content = iconv("GBK", "UTF-8", $text);
} else if ($encodType == 'UTF-8 BOM') {//本来就是UTF-8不用转换
$content = $text;
} else {//其他的格式都转化为UTF-8就可以了
$content = iconv($encodType, "UTF-8", $text);
}
return $content;
}
?>