乱码问题小记

这几天遇到了个乱码问题。想想还是很纠结的:

  1. >首先HTML 文件里面需要设置<meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\" />表示显示页面的时候需要gb2312字符集,所以如果有输出从服务器端传过来。需要的是gb2312编码的字符集
  2. >在form 表单里面需要enctype="multipart/form-data" 不然前端传到后端会乱码,可以从firebug里面看的到中文是乱码
  3. >后端显示的时候如果直接输出。可以加 header来定义字符集如header('Content-Type: application/json; charset=gbk');如果不加header 可以在服务器上面自定义默认字符集
  4. >如果表单提交的时候 target = iframe 那么后端PHP 里面 需要加上header 或者 echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\" />";
  5. >关于preg_match匹配中文 preg_match("/[\x{4e00}-\x{9fa5}]{1,20}/u", iconv("gb2312", "utf-8", $chineseString)));需要转码。因为这个函数是以utf-8的模式匹配的(后面有个u)否则匹配不到。
  6. >数据库方面使用$db->query('set names "gbk"'),告诉mysql服务器 我这里数据是用的gbk,希望你也给我返回gbk,不管你用的是何种编码。(这里本来会分为client编码,传输过程中编码,和期望返回编码)
  7. 后端如果输出到前端是 中文字符。不可以直接echo,json_endcode,但是json_encode不支持中文所以就需要以下函数:jsonEn
//json处理
    public static function jsonEn($array)
    {
        self::arrayRecursive($array, 'urlencode', true);
        $json = json_encode($array);
        return urldecode($json);

    }
    private static function arrayRecursive(&$array, $function, $apply_to_keys_also = false)
    {
            static $recursive_counter = 0;

            if (++$recursive_counter > 1000) {

                die('possible deep recursion attack');

            }

            foreach ($array as $key => $value) {

                if (is_array($value)) {

                    arrayRecursive($array[$key], $function, $apply_to_keys_also);

                } else {

                    $array[$key] = $function($value);

                }



                if ($apply_to_keys_also && is_string($key)) {

                    $new_key = $function($key);

                    if ($new_key != $key) {

                        $array[$new_key] = $array[$key];

                        unset($array[$key]);

                    }

                }

            }

        $recursive_counter--;
    }

  

原文地址:https://www.cnblogs.com/akulubala/p/3071046.html