zoukankan      html  css  js  c++  java
  • 字符编码转换

    因为一些特殊字符的显示效果的原因不得不把习惯的utf-8工程改成了GBK,由于使用了ajax技术,又涉及到了老问题——编码转换。

    一些表单验证需要返回json数据,php的json_encode函数只支持utf-8编码,无奈只得iconv了,需要达到的效果是GBK数组转换成utf-8数组传给json_encode函数。

    最开始的思路,将数组序列化后用iconv函数转换编码,之后再反序列化,代码如下:

    [php] view plaincopy
     
    1. unserialize(iconv('gbk','utf-8',serialize($array)));    

    得到的结果是空白,后来想起来配置文件里设置了默认编码 ini_set('default_charset', 'gbk');   这样用gbk反序列化utf-8的字符串肯定不好用了,此处在序列化和反序列化之间加个ini_set('default_charset', 'utf-8'); 应该也是可以的,但这么弄总觉得有点别扭,因为是全局的编码设置,很容易导致其他地方的编码问题,比如数据库操作。那么换个思路,用构建数组原型的序列化方法,借助var_export函数,最终函数如下:

    [php] view plaincopy
     
    1. function array_iconv($in_charset,$out_charset,$arr){    
    2.         return eval('return '.iconv($in_charset,$out_charset,var_export($arr,true).';'));    
    3. }    

    原理很简单 var_export设置第二个参数为true,返回数组原型字符串,将字符串转换为utf-8编码,之后再用eval来执行返回(类似匿名函数?),至此完美解决问题。

    后续:后来在网上搜了下资料,看有没有更好的方法,找到的都大同小异,都是利用递归调用iconv的方式,如果数组元素过多或者维数多一些,性能上肯定不怎么样了,更好的是原生代码的方式,不需要考虑是N维数组还是关联数组,一切都已经自动完成,保证数组转换前后数据一致。从代码的长短以及循环和原生方法的比较上,相信大家已经有了选择。

    多维数组转换



    function gbk2utf8(&$input){

    foreach($input as &$value){
    if(!is_array($value)) {
    $value = iconv('gbk', 'utf-8', $value);
    unset($value);
    }else{
    $this->gbk2utf8($value);
    }
    }
    return $input;
    }

    function utf2gbk(&$input){

    foreach($input as &$value){
    if(!is_array($value)) {
    $value = iconv('UTF-8', 'GBK', $value);
    unset($value);
    }else{
    $this->utf2gbk($value);
    }
    }
    return $input;
    }


    //字符串编码检测

    $encode = mb_detect_encoding($arr2, array("ASCII","UTF-8","gb2312","GBK","BIG5"));
    echo $encode;

  • 相关阅读:
    除了Web和Node,JavaScript还能做什么
    从Hybrid到React-Native: JS在移动端的南征北战史
    当React开发者初次走进React-Native的世界
    【React-Native】React-Native组件样式合集
    【github】论怎么去写一个高大上的ReadMe
    https://github.com/sindresorhus/awesome-nodejs 清单
    https://github.com/akullpp/awesome-java 清单
    https://github.com/ChristosChristofidis/awesome-deep-learning 清单
    https://github.com/josephmisiti/awesome-machine-learning 清单
    SpringBoot 为什么能够自动的注入一些常用的Bean ?详细分析SpringBoot 自动配置的实现
  • 原文地址:https://www.cnblogs.com/clphp/p/5113383.html
Copyright © 2011-2022 走看看