c/c++ 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 <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;
} 
?>


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM