Nov
18
今天在一个群里有人说自己的程序回显时中文都是乱码,但我一直没有遇上这样的问题,
所以我做一个测试
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编码是同相的。