php页面显示中文没有问题
mysql编码是utf-8,在phpmyadmin里查看也没有问题
但是数据库里的中文字符经查询显示在页面中的时候
肿么就都成了问号了呢。。在页面脚本中添加了
header("Content-type:text/html;charset=utf-8");
mysql_query('SET NAMES UTF8');
但是不管用啊。
mysql编码是utf-8,在phpmyadmin里查看也没有问题
但是数据库里的中文字符经查询显示在页面中的时候
肿么就都成了问号了呢。。在页面脚本中添加了
header("Content-type:text/html;charset=utf-8");
mysql_query('SET NAMES UTF8');
但是不管用啊。
2、存入数据库时的编码
3、php页面文件本身的编码
4、php页面内设置输出的编码
5、……看看这个帖子吧,讲得挺详细的:
http://blog.csdn.net/martinkro/article/details/5352474
知道了WEB开发中哪些地方涉及到了编码,也就知道了乱码产生的原因:上述3项编码设置不一致,由于各种编码绝大部分是兼容ASCII的,所以英文符号不会出现,中文就倒霉了。 下面是一些常见的错误情况与解决: 1、数据库采用UTF8编码,而页面申明编码是GB2312,这是最常见的产生乱码的原因。这时候在PHP脚本里面直接SELECT数据出来的就是乱码,需要在查询前先使用: mysql_query("SET NAMES GBK"); 来设定MYSQL连接编码,保证页面申明编码与这里设定的连接编码一致(GBK是GB2312的扩展)。如果页面是UTF-8编码的话,可以用: mysql_query("SET NAMES UTF8");
注意是UTF8而不是一般用的UTF-8。假如页面申明的编码与数据库内部编码一致可以不设定连接编码。 注:事实上MYSQL的数据输入输出比上面讲的更复杂一些,MYSQL配置文件my.ini中定义了2个默认编码,分别是[client]里的default -character-set和[mysqld]里的default-character-set来分别设定默认时候客户端连接和数据库内部所采用的编码。我们上面指定的编码其实是MYSQL客户端连接服务器时候的命令行参数character_set_client,来告诉MYSQL服务器接受到的客户端数据是什么编码的,而不是采用默认编码。 2、页面申明编码与文件本身编码不一致,这种情况很少发生,因为如果编码不一致美工做页面时候在浏览器看到的就是乱码了。更多时候是发布以后修改一些小BUG,以错误编码打开页面然后保存导致的。或者是用某些FTP软件直接在线修改文件,比如CuteFTP,由于软件编码配置错误而导致转换错了编码。 3、一些租用虚拟主机的朋友,明明上述3项编码都设置正确了还是有乱码。比方说网页是GB2312编码的,IE等浏览器打开却总是识别成UTF-8,网页HEAD里面已经申明是GB2312了,手动修改浏览器编码为GB2312 后页面显示正常。产生原因是服务器Apache设定了服务器全局的默认编码,在httpd.conf里面加了AddDefaultCharset UTF-8。这时候服务器会首先发送HTTP头给浏览器,其优先级比页面里申明编码高,自然浏览器就识别错了。解决办法有2个,请管理员在配置文件自己的虚机里加上一条AddDefaultCharset GB2312来覆盖全局配置,或者在自己目录的.htaccess里配置。
彻底凌乱了啊~~
原来能正常显示的页面的中文内容变成了乱码
问号的问题还是木有解决。。
zend和mysql都设置的是utf8
php的编码方式也都设置成了utf8,页面的乱码问题解决了
但是数据库中读取的中文字符还是显示成了问号
刚刚把所以的编码格式都改成GBK了,还是不行
我用phpmyadmin, set names要在哪里设置啊?
看这里我的回复,http://topic.csdn.net/u/20120615/15/5176e6d3-8d37-47c8-8f15-91c46dcca97b.html检查你的库里的数据编码是否正确,如果不对需要导出,改编码后导入(具体要看你的情况)如果还有问题,继续讨论,
即恢复环境到你发帖之前由
mysql编码是utf-8,在phpmyadmin里查看也没有问题
但是数据库里的中文字符经查询显示在页面中的时候就都成了问号
可知,问题出在从数据库读出以后。你贴出乱码数据的 base64编码数据,就可得到正确的解决方案
假定$s为读出的中文内容,那么就
echo base64_encode($s);
贴出结果
之前数据库查询的结果是
-------------
材料名称
55?????
30???
450?????
-------------
base64_encode[$s]以后 输出结果是------------------
材料名称
NTU/Pz8/Pw==
MzA/Pz8=
NDUwPz8/Pz8=
------------------这个什么意思啊,请教!
mysql_query('SET NAMES UTF8');
$conn=db_connect();
$result=$conn->query($query);
if (!$result){
return false;
}
else return $result;}
$conn=db_connect();
mysql_query('SET NAMES UTF8');
$result=$conn->query($query);
if (!$result){
return false;
}
else return $result;……
页面源代码中编码如何?我也不知道说啥了,你的环境我们看不见,代码,数据库都不清楚,
你phpmyadmin中能看到正常的,一般库中数据无问题,
如果setnames正确和页面编码正确,应无问题明白了原理其实啥都不是问题,
如果你看通了我那个帖子里写的,你以后不会再碰到编码问题
-- ----------------------------------------------------------
-- 表的结构 `material_describe`
--CREATE TABLE IF NOT EXISTS `material_describe` (
`materialid` int(3) NOT NULL COMMENT '设备编号',
`material_name` varchar(20) NOT NULL COMMENT '设备名称',
PRIMARY KEY (`materialid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;--
-- 转存表中的数据 `material_describe`
--INSERT INTO `material_describe` (`materialid`, `material_name`) VALUES
(101, '55米双检电缆'),
(102, '30米电缆'),
(103, '450米海交叉线');页面文件:dailywork.php
<?php require_once('dlmanager_fns.php');
session_start();
echo header("Content-Type: text/html; charset=utf-8");
do_html_header('DailyWork');
check_valid_user();
$query="select * from material_describe ";
$result=get_result($query);
display_dailywork($result);
do_html_footer();
?>
数据库连接类
<?phpfunction db_connect() {
$db = new mysqli('localhost', 'root', '111', 'dl_manager');
if (!$db) {
throw new Exception('Could not connect to database server');
} else {
return $db;
}
}
function get_result($query){ $conn=db_connect();
mysql_query('SET NAMES UTF8');
$result=$conn->query($query);
if (!$result){
echo "result error!";
return false;
}
else return $result;
}
?>
显示表单 function display_dailywork($result){
?>
<form id="dailywork_form" name="dailywork_form" action="" method="">
<table width="512" border="2" cellpadding="1" cellspacing="2">
<tr>
<td>材料编号</td>
<td>材料名称</td>
</tr>
<?php
$num=$result->num_rows;
echo "清单共有材料".$num."种:";
for($i=0; $i<$num; $i++){
$row=$result->fetch_assoc();
?>
<tr>
<td><?php echo $row['materialid'];?></td>
<td><?php echo $row['material_name'];?></td> </tr>
<?php
}
?>
</table>
</form>
<?php
}显示结果如下:
-------------------------
清单共有材料3种:
材料编号 材料名称
101 55?????
102 30???
103 450?????
---------------------------
PHP文件在zend中设置的都是utf8,包括 file->properties和project->properties两处设置
所有的文件我都用记事本打开另存为utf8编码格式过
数据库中也都改成了utf8字符集
还有哪里不对啊?你的帖子我看了,也基本上能明白是怎么回事
但是我都问题还是没有解决
mysql_query('SET NAMES UTF8');
这句从get_result里拿出来, 放进db_connect里return之前INSERT INTO `material_describe` (`materialid`, `material_name`) VALUES
(101, '55米双检电缆'),
(102, '30米电缆'),
(103, '450米海交叉线');
这句你是在mysql里运行的吗?插入后用
select length(material_name) from material_describe where materialid=101
检查一下字节数,应为17html页面meta如何设置的?是这样吗?
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>如还是????再上来说一声
mysql_query('SET NAMES UTF8');放到return之前
但是依然显示??,不显示中文字符
2、数据是我直接在phpmyadmin里插入的,select结果确实是17
3、没有html页面
但是写了个head的函数
function do_html_header($title){
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title><?php echo $title; ?></title>
<style>
body { font-family:Arial, Helvetica, sans-serif; font-size:13 px }
li, td {font-family:Arial, Helvetica, sans-serif; font-size:13 px}
hr {color: #3333cc; width=300px; text-align: left}
a{ color:#000000}
</style>
</head>
<body>
<?php
if($title){
do_html_heading($title);
}
}
meta标签放在第一行了
<?phpfunction db_connect() { $db = new mysqli('localhost', 'root', '111', 'dl_manager');
....
function get_result($query){$conn=db_connect();
mysql_query('SET NAMES UTF8');你的语言设置并没有生效,因为你使用的是 mysqli 扩展
ok.
把每个varchar字段也改为utf8-genial-ci
若没乱,见#38
写库是SET NANES GBK或者UTF-8
alter database 数据库名 default character set 'utf8';#修改数据表字符集
alter table 表名 default character set 'utf8';#查询之前加上
mysql_query("SET NAMES utf8");
数据库操作编码
网页header编码
网页本身文件的编码这几点保持一致。
很多时候,数据库中 phpmyadmin中是显示正常,如果按照几位版主的说法,如果用控制台查看,我想楼上的问题出在控制台本身显示编码为GBK,所以问题并非数据库中的数据,所以仅仅是控制台显示问题,将
显示设置为 set character_set_result=gbk; 中文应该能正常显示
mysql_query('set names gb2312');
这句非常有问,我的问号,把utf8改成gb2312问号就变友中文了。
mysql_query('set names gb2312');
在选择数据库后加这句【mysql_query('set names gb2312');】非常有用,我的问号,把utf8改成gb2312问号就变成中文了。
记住name是要加s结尾不然还会显示问号。