乱码问题小记
这几天遇到了个乱码问题。想想还是很纠结的:
- >首先HTML 文件里面需要设置<meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\" />表示显示页面的时候需要gb2312字符集,所以如果有输出从服务器端传过来。需要的是gb2312编码的字符集
- >在form 表单里面需要enctype="multipart/form-data" 不然前端传到后端会乱码,可以从firebug里面看的到中文是乱码
- >后端显示的时候如果直接输出。可以加 header来定义字符集如header('Content-Type: application/json; charset=gbk');如果不加header 可以在服务器上面自定义默认字符集
- >如果表单提交的时候 target = iframe 那么后端PHP 里面 需要加上header 或者 echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\" />";
- >关于preg_match匹配中文 preg_match("/[\x{4e00}-\x{9fa5}]{1,20}/u", iconv("gb2312", "utf-8", $chineseString)));需要转码。因为这个函数是以utf-8的模式匹配的(后面有个u)否则匹配不到。
- >数据库方面使用$db->query('set names "gbk"'),告诉mysql服务器 我这里数据是用的gbk,希望你也给我返回gbk,不管你用的是何种编码。(这里本来会分为client编码,传输过程中编码,和期望返回编码)
- 后端如果输出到前端是 中文字符。不可以直接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--; }