c php乱码,c/c++ base64编码后,通过php解码,中文乱码解决办法

本文探讨了C/C++和PHP解码Base64编码后中文显示乱码的问题,重点介绍了PHP中通过自定义函数处理不同编码格式并解决乱码的方法,以及如何确保在网页上正确显示中文内容。

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

2018/08/31 17:20

2018/08/31 17:26 2,826 base64.cpp

2018/08/31 17:26 151 base64.h

2018/09/03 16:22

2018/08/14 09:37 1,553 ReadMe.txt

2018/08/31 09:55

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;

}

转码后,中文显示正常了,结果如下图:

e7a7d38a380ff962243480f3416e6464.png

4. 附上全部测试代码:

$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_

{

$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;

}

?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值