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; } ?>