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中利用XML技术构造远程服务(下)
Oct 09 PHP
支持oicq头像的留言簿(二)
Oct 09 PHP
Dedecms V3.1 生成HTML速度的优化办法
Mar 18 PHP
php编程实现获取excel文档内容的代码实例
Jun 28 PHP
linux下使用ThinkPHP需要注意大小写导致的问题
Aug 02 PHP
php json_encode()函数返回json数据实例代码
Oct 10 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
Nov 19 PHP
深入浅析PHP7.0新特征(五大新特征)
Oct 29 PHP
Yii2 RESTful中api的使用及开发实例详解
Jul 06 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
Feb 15 PHP
ThinkPHP下表单令牌错误与解决方法分析
May 20 PHP
PHP常用操作类之通信数据封装类的实现
Jul 16 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
PHP配置心得包含MYSQL5乱码解决
2006/11/20 PHP
php正则表达式使用的详细介绍
2013/04/27 PHP
PHP防止表单重复提交的几种常用方法汇总
2014/08/19 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
复制Input内容的js代码_支持所有浏览器,修正了Firefox3.5以上的问题
2010/06/21 Javascript
js 动态文字滚动的例子
2011/01/17 Javascript
Jquery $when done then的用法详解
2016/05/20 Javascript
教你如何在Node.js中使用jQuery
2016/08/28 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
2016/10/27 Javascript
jQuery的Read()方法代替原生JS详解
2016/11/08 Javascript
node中使用es5/6以及支持性与性能对比
2017/08/11 Javascript
JS实现中英文混合文字溢出友好截取功能
2018/08/06 Javascript
Vue项目History模式404问题解决方法
2018/10/31 Javascript
Vue结合路由配置递归实现菜单栏功能
2020/06/16 Javascript
ES11屡试不爽的新特性,你用上了几个
2020/10/21 Javascript
[04:52]DOTA2亚洲邀请赛附加赛 TOP10精彩集锦
2015/01/29 DOTA
小结Python用fork来创建子进程注意事项
2014/07/03 Python
python中的函数用法入门教程
2014/09/02 Python
Python实现求最大公约数及判断素数的方法
2015/05/26 Python
Python正则简单实例分析
2017/03/21 Python
Python实现两款计算器功能示例
2017/12/19 Python
Python获取数据库数据并保存在excel表格中的方法
2019/06/12 Python
在linux系统下安装python librtmp包的实现方法
2019/07/22 Python
numpy:找到指定元素的索引示例
2019/11/26 Python
CSS3 transforms应用于背景图像的解决方法
2019/04/16 HTML / CSS
Volcom英国官方商店:美国殿堂级滑板、冲浪、滑雪服装品牌
2019/03/13 全球购物
函授毕业生自我鉴定范文
2014/03/25 职场文书
个人评语大全
2014/05/04 职场文书
小学运动会口号
2014/06/07 职场文书
信息技术国培研修日志
2015/11/13 职场文书
再见,2019我们不负使命;你好,2020我们砥砺前行
2020/01/03 职场文书
使用logback实现按自己的需求打印日志到自定义的文件里
2021/08/30 Java/Android
JavaScript最完整的深浅拷贝实现方式详解
2022/02/28 Javascript
Java完整实现记事本代码
2022/06/16 Java/Android
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
2022/12/24 MySQL