php编码的问题及解决办法
来源:互联网 发布:宠物公墓小说知乎 编辑:程序博客网 时间:2024/06/09 19:10
今天在一个群里有人说自己的程序回显时中文都是乱码,但我一直没有遇上这样的问题,
所以我做一个测试
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编码是同相的。
0 0
- php编码的问题及解决办法
- php fgetcsv函数的问题及解决办法
- php编码转换及问题
- PHP的编码问题
- PHP返回JSON数据及中文编码问题的解决方案
- java编码问题的解决办法!!
- 关于MemcacheDB PHP客户端的问题及解决办法
- php和uploadify上传文件出现的问题及解决办法
- PHP 的字符集编码问题
- PHP 的字符集编码问题
- PHP 的字符集编码问题
- PHP 的字符集编码问题
- PHP的一点编码问题
- PHP字符串的编码问题
- PHP字符串的编码问题
- PHP字符串的编码问题
- PHP字符串的编码问题
- 关于php的编码问题
- 第十七章--回收页框
- JSP+JavaBean简单计算器
- android[API]Android字体高度的研究
- HTML
- 【cocos2d-x从c++到js】注册函数
- php编码的问题及解决办法
- jQuery的动画处理总结
- Object未定义
- 查看oracle执行计划方法( 二)
- Android开发EditText不自动弹出键盘
- 无cygwin的cocos2dx之安卓环境
- 【cocos2d-x从c++到js】傀儡构造函数
- ASP.net 类库中获得当前路径的方法(非页面中)
- Activity与Service交互