PHP base64编码后解码乱码的解决办法


Posted in PHP onJune 19, 2014

在用PHP做东西的时候发现了一个问题,可以简单的归结为乱码的问题,但是这个问题不是函数本身造成的。来看看罪魁祸首是谁。

嫌疑人:base64_encode 和 base64_decode

罪行:我写了一个跳转和提示函数,接收提示信息后跳转到指定的页面,但是跳转提示时汉字乱码。

跳转模版代码如下:

<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="author" content="王健 wj@yurendu.com" />

<title>跳转提示</title>

<style type="text/css">

*{ padding: 0; margin: 0; }

body{ background: #fff; font-family: '微软雅黑'; color: #333; font-size: 16px;  text-align:center; }

.system-message{ width:600px; margin:150px auto 0 auto; background:#f8f8f8; border:1px solid #ccc;-webkit-border-radius: 8px;-moz-border-radius: 8px;border-radius: 8px;-webkit-box-shadow: #666 0px 0px 10px;-moz-box-shadow: #666 0px 0px 10px;box-shadow: #666 0px 0px 10px;}

.system-message h1{ font-size:30px; font-weight:normal; height:100px; line-height:100px; color:#c60;}

.system-message .jump{ padding: 40px 0;}

.system-message .jump a{ color: #333;}

.system-message .success,.system-message .error{ height:60px; line-height:70px; font-size: 18px; color:#900;}

.system-message .detail{ font-size: 12px; line-height: 20px; margin-top: 12px; display:none}

</style>

</head>

<body>

    <div class="system-message">

        <?php if( $_GET['success'] ){?>

            <h1>:)   恭喜!</h1>

            <p class="success"><?php echo base64_decode($_GET['message']); ?></p>

        <?php }else{?>

            <h1>:(   出错了!</h1>

            <p class="error"><?php echo base64_decode($_GET['message']); ?></p>

        <?php }?>

        <p class="detail"></p>

        <p class="jump">系统将在 <b id="wait"><?php echo $_GET['time']; ?></b> 后跳转,可直接 <a id="href" href="<?php echo base64_decode($_GET['url']); ?>">点此跳转</a></p>

        

    </div>

<script type="text/javascript">

(function(){

var wait = document.getElementById('wait'),href = document.getElementById('href').href;

var interval = setInterval(function(){

 var time = --wait.innerHTML;

 if(time <= 0) {

  location.href = href;

  clearInterval(interval);

 };

}, 1000);

})();

</script>

</body>

</html>

PHP redirect函数定义如下:

/* 提醒后跳转 */

function _alert( $success=true, $message='success', $time='3', $url='/'){

 header('Location:/include/redirect.php?success='.$success.'&message='.base64_encode($message).'&time='.$time.'&url='.base64_encode($url));

 exit;

}

假如在PHP中这样调用函数的话:
$query = "update content set bid='$clean[bid]',title='$clean[title]',content='$clean[content]',path='$clean[path]' where id=".$clean['id'];

if( mysql_query($query) ){

 _alert(1,'修改成功',3,'/admin/manage.php');

}else{

 _alert(false,'修改失败'.mysql_error(),5,'/admin/manage.php');

}

你就会看到,“修改成功”或者是“修改失败”这几个汉字乱码了。

为什么?

有时候用base64_encode加密后,以GET的形式传到其他页面,用base64_decode解密的时候,出现乱码。

遇到这个问题的时候,我就纳闷了,为什么有一些能正确解密,但是有一些却出现乱码呢?

后来经过检查,发现有一些中文字符,用GET形式传过来的时候,+号会被替换成空格。

为了防止出现乱码的情况,我做了一步替换,然后再解密,果然,乱码的问题,不复存在了!

现在问题已经很简单了,只要多写一步就好了

$str = base64_decode(str_replace(" ","+",$_GET['str']));

原来,文章一开始定错了嫌疑人了,冤枉了那两个函数了。。。

还可以参考这篇文章:PHP安全的URL字符串base64编码和解码

PHP 相关文章推荐
PHP的宝库目录--PEAR
Oct 09 PHP
PHP 数组入门教程小结
May 20 PHP
用php获取本周,上周,本月,上月,本季度日期的代码
Aug 05 PHP
PHP中的生成XML文件的4种方法分享
Oct 06 PHP
windows下配置php5.5开发环境及开发扩展
Dec 25 PHP
整理php防注入和XSS攻击通用过滤
Sep 13 PHP
ThinkPHP中html:list标签用法分析
Jan 09 PHP
php的PDO事务处理机制实例分析
Feb 16 PHP
PHP实时统计中文字数和区别
Feb 28 PHP
laravel-admin 在列表页添加自定义按钮的例子
Sep 30 PHP
PHP执行linux命令6个函数代码实例
Nov 24 PHP
详解PHP服务器如何在有限的资源里最大提升并发能力
May 25 PHP
PHP安全的URL字符串base64编码和解码
Jun 19 #PHP
PHP中的多行字符串传递给JavaScript的两种方法
Jun 19 #PHP
ThinkPHP模板引擎之导入资源文件方法详解
Jun 18 #PHP
ThinkPHP CURD方法之field方法详解
Jun 18 #PHP
ThinkPHP CURD方法之data方法详解
Jun 18 #PHP
ThinkPHP CURD方法之order方法详解
Jun 18 #PHP
ThinkPHP CURD方法之table方法详解
Jun 18 #PHP
You might like
真正的ZIP文件操作类(php)
2007/07/21 PHP
初学PHP的朋友 经常问的一些问题。不断更新
2011/08/11 PHP
php获取远程图片的两种 CURL方式和sockets方式获取远程图片
2011/11/07 PHP
分享PHP header函数使用教程
2013/09/05 PHP
关于WordPress的SEO优化相关的一些PHP页面脚本技巧
2015/12/10 PHP
Symfony2开发之控制器用法实例分析
2016/02/05 PHP
PHP数据库操作Helper类完整实例
2016/05/11 PHP
一段实用的php验证码函数
2016/05/19 PHP
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
2013/01/04 Javascript
jquery右下角弹出提示框示例代码
2013/10/08 Javascript
javascript实现表单提交后,提交按钮不可用的方法
2015/04/18 Javascript
NodeJs中的VM模块详解
2015/05/06 NodeJs
全面解析Bootstrap中tab(选项卡)的使用方法
2016/06/06 Javascript
layui选项卡效果实现代码
2017/05/19 Javascript
Angular实现较为复杂的表格过滤,删除功能示例
2017/12/23 Javascript
微信小程序在text文本实现多种字体样式
2019/11/08 Javascript
react的hooks的用法详解
2020/10/12 Javascript
python根据路径导入模块的方法
2014/09/30 Python
python单元测试unittest实例详解
2015/05/11 Python
python定时器(Timer)用法简单实例
2015/06/04 Python
python中pygame针对游戏窗口的显示方法实例分析(附源码)
2015/11/11 Python
使用PyCharm配合部署Python的Django框架的配置纪实
2015/11/19 Python
解决tensorflow1.x版本加载saver.restore目录报错的问题
2018/07/26 Python
Python 实现文件读写、坐标寻址、查找替换功能
2019/09/11 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
2020/02/21 Python
pytorch加载语音类自定义数据集的方法教程
2020/11/10 Python
html5利用canvas实现颜色容差抠图功能
2019/12/23 HTML / CSS
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
自我鉴定模板
2013/10/29 职场文书
军训心得体会
2013/12/31 职场文书
《长相思》听课反思
2014/04/10 职场文书
2015年企业新年寄语
2014/12/08 职场文书
法人身份证明书
2015/06/18 职场文书
高考要来啦!用Python爬取历年高考数据并分析
2021/06/03 Python
Python中seaborn库之countplot的数据可视化使用
2021/06/11 Python
vue3使用vuedraggable实现拖拽功能
2022/04/06 Vue.js