php编码的问题及解决办法
2014-03-26 11:51
225 查看
今天在一个群里有人说自己的程序回显时中文都是乱码,但我一直没有遇上这样的问题,
所以我做一个测试
1)ansii.php,保存的编码为ansi
<?php
header('Content-Type:text/html;charset=UTF8');
$lang="测试编码";
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base target="_blank">
<meta http-equiv="Content-Type" content="text/html; charset=UTF8" />
</head>
<body>
<?echo $lang;?>
</body>
</html>
运行后将会看到
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base target="_blank">
<meta http-equiv="Content-Type" content="text/html; charset=UTF8" />
</head>
<body>
���Ա���</body>
</html>
2)把ansii.php另存为utf.php,保存的编码为utf-8
<?php
header('Content-Type:text/html;charset=UTF8');
$lang="测试编码";
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base target="_blank">
<meta http-equiv="Content-Type" content="text/html; charset=UTF8" />
</head>
<body>
<?echo $lang;?>
</body>
</html>
运行结果:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base target="_blank">
<meta http-equiv="Content-Type" content="text/html; charset=UTF8" />
</head>
<body>
测试编码</body>
</html>
3)把utf8.php中把charset=UTF8改成charset=GBK(共有两处),运行结果如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base target="_blank">
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
</head>
<body>
娴嬭瘯缂栫爜</body>
</html>
从上面的结果可以看到php在加载php程序里会把里面的字符按照文件的编码记录到变量里的。所以当文件是ansii码保存时,变量里面的中文已经保存成ansii码方式。如果文件是utf8编码,变量里的中文都会变成utf8。
所以当文件是某种编码时,却要使用另一种编码显示时,会出乱码。
解决方法:
1)程序开发前,选定数据编码格式(包括程序文件,数据库),全部都需要统一。目前来做对于多个语言做得比较好的编码是UTF8
2)程序里尽量不要有多字节文字(如:中文,日语),如果必须引用其它编码可以使用mb_detect_encoding()得到字符串的编码格式,然后再用mb_detect_encoding()转成你需要的编码格式。具体用法可以查看手册.
小知识:
GBK在计算的里与CP936编码是同相的。
所以我做一个测试
1)ansii.php,保存的编码为ansi
<?php
header('Content-Type:text/html;charset=UTF8');
$lang="测试编码";
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base target="_blank">
<meta http-equiv="Content-Type" content="text/html; charset=UTF8" />
</head>
<body>
<?echo $lang;?>
</body>
</html>
运行后将会看到
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base target="_blank">
<meta http-equiv="Content-Type" content="text/html; charset=UTF8" />
</head>
<body>
���Ա���</body>
</html>
2)把ansii.php另存为utf.php,保存的编码为utf-8
<?php
header('Content-Type:text/html;charset=UTF8');
$lang="测试编码";
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base target="_blank">
<meta http-equiv="Content-Type" content="text/html; charset=UTF8" />
</head>
<body>
<?echo $lang;?>
</body>
</html>
运行结果:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base target="_blank">
<meta http-equiv="Content-Type" content="text/html; charset=UTF8" />
</head>
<body>
测试编码</body>
</html>
3)把utf8.php中把charset=UTF8改成charset=GBK(共有两处),运行结果如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base target="_blank">
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
</head>
<body>
娴嬭瘯缂栫爜</body>
</html>
从上面的结果可以看到php在加载php程序里会把里面的字符按照文件的编码记录到变量里的。所以当文件是ansii码保存时,变量里面的中文已经保存成ansii码方式。如果文件是utf8编码,变量里的中文都会变成utf8。
所以当文件是某种编码时,却要使用另一种编码显示时,会出乱码。
解决方法:
1)程序开发前,选定数据编码格式(包括程序文件,数据库),全部都需要统一。目前来做对于多个语言做得比较好的编码是UTF8
2)程序里尽量不要有多字节文字(如:中文,日语),如果必须引用其它编码可以使用mb_detect_encoding()得到字符串的编码格式,然后再用mb_detect_encoding()转成你需要的编码格式。具体用法可以查看手册.
小知识:
GBK在计算的里与CP936编码是同相的。
相关文章推荐
- 【PHP问题大全】--PHP连接MySQL出现乱码的编码解决办法
- 抛开Cookie使用SESSION-PHP中SESSION不能跨页传递问题的解决办法(转载)
- PHP后台处理jQuery Ajax跨域请求问题 — xx was not called解决办法
- MySQL中日期比较时遇到的编码问题解决办法
- php提取csv格式文件中的字符串出现的问题及解决办法
- php Sql Server连接失败问题及解决办法
- 32位win7系统下配置IIS遇到php-cgi.exe - FastCGI 进程意外退出问题的解决办法
- php中session引起错误问题集锦与解决办法
- Laravel 出现"RuntimeException inEncrypter.php line 43: The only supported ciphers are AES-128-CBC and AES-256-CBC with the correct key lengths."问题的解决办法
- PHP中SESSION不能跨页传递问题的解决办法
- PHP输出到文件时 不会换行问题解决办法
- linux下由于系统编码问题造成乱码的解决办法
- 已解决了ajax(源文件编码gb2312)发送+php接收(源文件编码gb2312)中文乱码问题(utf-8也通用)
- 如何解决php开发中的编码问题
- 【MySQL】统一控制台-pma-PHP编码!解决中文乱码问题
- php session常见问题集锦及解决办法
- PHP中json_encode中文被Unicode编码的解决办法
- [Blackberry]Bug_build时出错_java build 编码格式问题及解决办法
- 在初学php时用到的一些问题以及解决办法
- PHP中Session引起的脚本阻塞问题解决办法