关于SQL Server获取的数据遍历转码问题(数组转JSON)

本文介绍如何解决PHP调用数据库中GBK编码视图数据并转换为JSON格式时出现的错误。通过自定义类arrayiconv实现了遍历转换数组编码,确保了输出的正确性和兼容性。
利用PHP代码调用数据库视图的数据,json_encode出来后报错。

错误为:- Malformed UTF-8 characters, possibly incorrectly encoded

SQL sever 里面的数据为GBK格式,需要一一遍历转换格式输出。

代码如下:

    $hostname='192.168.1.XXX';

    $dbname='ZD';

    $username='Reader';

    $password='TestReader';
//使用ODBC方式连接
    $dbDB = new PDO("odbc:Driver={SQL Server};Server=$hostname;Database=$dbname", $username, $password);

    $sql = "select top 100 * from V_XZ_SPZK;";
    

    $rs=$dbDB->prepare($sql);//准备查询语句
    $rs->execute();            //执行查询语句
    $rs->setFetchMode(PDO::FETCH_ASSOC);
    $result_arr = $rs->fetchAll();

    $a =arrayiconv::Conversion($result_arr,"gbk","utf-8");
    $result= json_encode($a,JSON_UNESCAPED_UNICODE);
    return ($result);


    switch (json_last_error()) {
        case JSON_ERROR_NONE:
            echo ' - No errors';
            break;
        case JSON_ERROR_DEPTH:
            echo ' - Maximum stack depth exceeded';
            break;
        case JSON_ERROR_STATE_MISMATCH:
            echo ' - Underflow or the modes mismatch';
            break;
        case JSON_ERROR_CTRL_CHAR:
            echo ' - Unexpected control character found';
            break;
        case JSON_ERROR_SYNTAX:
            echo ' - Syntax error, malformed JSON';
            break;
        case JSON_ERROR_UTF8:
            echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
            break;
        default:
            echo ' - Unknown error';
            break;
    }

    echo PHP_EOL;

利用已经编辑好的转码程序:(引用作者阿夏:http://www.cnblogs.com/upmyself/archive/2013/01/06/2848477.html)

class arrayiconv
{
    static protected $in;
    static protected $out;
    /**
     * 静态方法,该方法输入数组并返回数组
     *
     * @param unknown_type $array 输入的数组
     * @param unknown_type $in 输入数组的编码
     * @param unknown_type $out 返回数组的编码
     * @return unknown 返回的数组
     */
    static public function Conversion($array,$in,$out)
    {
        self::$in=$in;
        self::$out=$out;
        return self::arraymyicov($array);
    }
    /**
     * 内部方法,循环数组
     *
     * @param unknown_type $array
     * @return unknown
     */
    static private function arraymyicov($array)
    {
        foreach ($array as $key=>$value)
        {
            $key=self::myiconv($key);
            if (!is_array($value)) {
                $value=self::myiconv($value);
            }else {
                $value=self::arraymyicov($value);
            }
            $temparray[$key]=$value;
        }
        return $temparray;
    }
    /**
     * 替换数组编码
     *
     * @param unknown_type $str
     * @return unknown
     */
    static private function myiconv($str)
    {
        return iconv(self::$in,self::$out,$str);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值