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来处理多个提交任务
May 08 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
Jun 26 PHP
使用PHP接收POST数据,解析json数据
Jun 28 PHP
php缓存技术详细总结
Aug 07 PHP
php中\r \r\n \t的区别示例介绍
Feb 08 PHP
ThinkPHP实现带验证码的文件上传功能实例
Nov 01 PHP
分享十款最出色的PHP安全开发库中文详细介绍
Mar 22 PHP
遍历指定目录,并存储目录内所有文件属性信息的php代码
Oct 28 PHP
phpmailer绑定邮箱的实现方法
Dec 01 PHP
PHP自定义函数实现数组比较功能示例
Oct 19 PHP
PHP实现的AES 128位加密算法示例
Sep 16 PHP
Yii框架应用组件用法实例分析
May 15 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
MySQL 日期时间函数常用总结
2012/06/12 PHP
php获取汉字首字母的函数
2013/11/07 PHP
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
2014/10/30 PHP
PHP实现将HTML5中Canvas图像保存到服务器的方法
2014/11/28 PHP
PHP的引用详解
2015/02/22 PHP
Linux下 php7安装redis的方法
2018/11/01 PHP
PHP+iframe模拟Ajax上传文件功能示例
2019/07/02 PHP
laravel框架添加数据,显示数据,返回成功值的方法
2019/10/11 PHP
PHP中迭代器的简单实现及Yii框架中的迭代器实现方法示例
2020/04/26 PHP
基于Web标准的UI组件 — 树状菜单(2)
2006/09/18 Javascript
jquery 日期分离成年月日的代码
2010/05/14 Javascript
原生js实现查找/添加/删除/指定元素的class
2013/04/12 Javascript
使用jQuery实现的掷色子游戏动画效果
2014/03/14 Javascript
Javascript中For In语句用法实例
2015/05/14 Javascript
jQuery在线选座位插件seat-charts特效代码分享
2015/08/27 Javascript
vue使用stompjs实现mqtt消息推送通知
2017/06/22 Javascript
关于Vue背景图打包之后访问路径错误问题的解决
2017/11/03 Javascript
浅析从vue源码看观察者模式
2018/01/29 Javascript
JavaScript中变量提升与函数提升经典实例分析
2018/07/26 Javascript
微信小程序实现单选功能
2018/10/30 Javascript
ES6中的迭代器、Generator函数及Generator函数的异步操作方法
2019/05/12 Javascript
JavaScript canvas动画实现时钟效果
2020/02/10 Javascript
javascript canvas时钟模拟器
2020/07/13 Javascript
Linux环境下MySQL-python安装过程分享
2015/02/02 Python
Python+MongoDB自增键值的简单实现
2016/11/04 Python
python爬虫入门教程--正则表达式完全指南(五)
2017/05/25 Python
Python中 CSV格式清洗与转换的实例代码
2019/08/29 Python
利用python Selenium实现自动登陆京东签到领金币功能
2019/10/31 Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
2020/02/24 Python
基于matplotlib xticks用法详解
2020/04/16 Python
微信浏览器左上角返回按钮拦截功能
2017/11/21 HTML / CSS
大学生表扬信范文
2014/01/09 职场文书
个人查摆问题自查报告
2014/10/16 职场文书
2015年端午节活动总结
2015/02/11 职场文书
毕业论文答辩演讲稿
2015/06/23 职场文书
Java Socket实现多人聊天系统
2021/07/15 Java/Android