乱码问题小记
这几天遇到了个乱码问题。想想还是很纠结的:
- >首先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--;
}
浙公网安备 33010602011771号