php页面显示中文没有问题
mysql编码是utf-8,在phpmyadmin里查看也没有问题
但是数据库里的中文字符经查询显示在页面中的时候
肿么就都成了问号了呢。。在页面脚本中添加了
header("Content-type:text/html;charset=utf-8"); 
mysql_query('SET NAMES UTF8');  
但是不管用啊。

解决方案 »

  1.   

    以前我也遇到过,百度之后大概有些了解,php+mysql中编码需要注意的N个地方:1、数据库自己的字符集
    2、存入数据库时的编码
    3、php页面文件本身的编码
    4、php页面内设置输出的编码
    5、……看看这个帖子吧,讲得挺详细的:
    http://blog.csdn.net/martinkro/article/details/5352474
      

  2.   

    这个是我以前百度到的东东,保存在本地的。   一般来说,乱码的出现有2种原因,首先是由于编码(charset)设置错误,导致浏览器以错误的编码来解析,从而出现了满屏乱七八糟的“天书”,其次是文件被以错误的编码打开,然后保存,比如一个文本文件原先是GB2312编码的,却以UTF-8编码打开再保存。要解决上述乱码问题,首先需要知道开发中哪些环节涉及到了编码: 1、文件编码:指的是页面文件(.html,.php等)本身是以何种编码来保存的。记事本和Dreamweaver 在打开页面时候会自动识别文件编码因而不太会出问题。而ZendStudio却不会自动识别编码,它只会根据首选项的配置固定以某种编码打开文件,如果工作时候一不注意,用错误编码打开文件,做了修改之后一保存,乱码就出现了(我深有体会)。 2、页面申明编码:在HTML代码HEAD里面,可以用<meta http-equiv="Content-Type" content="text/html; charset="XXX" />来告诉浏览器网页采用了什么编码,目前中文网站开发中XXX主要用的是GB2312和UTF-8两种编码。 3、数据库连接编码:指的是进行数据库操作时候以哪种编码与数据库传输数据,这里需要注意的是不要与数据库本身的编码混淆,比如MySQL内部默认是latin1编码,也就是说Mysql是以latin1编码来存储数据,以其他编码传输给Mysql的数据会被转换成latin1编码。 
    知道了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里配置。
      

  3.   

    我把zend的编码从GBK改成UTF8
    彻底凌乱了啊~~
    原来能正常显示的页面的中文内容变成了乱码
    问号的问题还是木有解决。。
      

  4.   

    试了,还是不行
    zend和mysql都设置的是utf8
    php的编码方式也都设置成了utf8,页面的乱码问题解决了
    但是数据库中读取的中文字符还是显示成了问号
      

  5.   

    但是PHP页面的中文内容可以正常显示啊
      

  6.   

    重新写数据,写之前也要设置 set names
      

  7.   

    是我要把以前的数据删了,重新录入一遍吗?
    刚刚把所以的编码格式都改成GBK了,还是不行
    我用phpmyadmin, set names要在哪里设置啊?
      

  8.   

    插入数据前先 set names 嘛...你怎么插数据的呢?直接在phpmyadmin插入 ?
      

  9.   

    前两天刚写了一个详细的回复,
    看这里我的回复,http://topic.csdn.net/u/20120615/15/5176e6d3-8d37-47c8-8f15-91c46dcca97b.html检查你的库里的数据编码是否正确,如果不对需要导出,改编码后导入(具体要看你的情况)如果还有问题,继续讨论,
      

  10.   

    回退自你发这个帖子以来的修改
    即恢复环境到你发帖之前由
    mysql编码是utf-8,在phpmyadmin里查看也没有问题
    但是数据库里的中文字符经查询显示在页面中的时候就都成了问号
    可知,问题出在从数据库读出以后。你贴出乱码数据的 base64编码数据,就可得到正确的解决方案
    假定$s为读出的中文内容,那么就
    echo base64_encode($s);
    贴出结果
      

  11.   

    在你数据库连接类里面设置下:mysql_query('SET NAMES UTF8');   
      

  12.   

    我按着你说的做了,恢复环境到发帖前
    之前数据库查询的结果是
    -------------
    材料名称
    55?????
    30???
    450?????
    -------------
    base64_encode[$s]以后 输出结果是------------------
    材料名称
    NTU/Pz8/Pw==
    MzA/Pz8=
    NDUwPz8/Pz8=
    ------------------这个什么意思啊,请教!
      

  13.   

    set names 加在哪儿了?
      

  14.   

    我写了这个函数function get_result($query){
            mysql_query('SET NAMES UTF8');
    $conn=db_connect();
      $result=$conn->query($query);
      if (!$result){
        return false;
      }
      else return $result;}
      

  15.   

    导出了数据库的SQL文件,里面的default charset 都是utf8,没看出什么问题啊?
      

  16.   

    set names要加在connect后,我12楼的回复里的链接你没看?
      

  17.   

    意思是改成这样吗?function get_result($query){
    $conn=db_connect();
    mysql_query('SET NAMES UTF8');
    $result=$conn->query($query);
    if (!$result){
    return false;
    }
    else return $result;……
      

  18.   

    文件另存为的字符集改成UTF8就好了
      

  19.   

    你检查一下,数据库、表、字段都是设置成UTF8了吗?
      

  20.   

    你的页面在哪里,能看见吗?
    页面源代码中编码如何?我也不知道说啥了,你的环境我们看不见,代码,数据库都不清楚,
    你phpmyadmin中能看到正常的,一般库中数据无问题,
    如果setnames正确和页面编码正确,应无问题明白了原理其实啥都不是问题,
    如果你看通了我那个帖子里写的,你以后不会再碰到编码问题
      

  21.   

    数据库 
    -- ----------------------------------------------------------
    -- 表的结构 `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字符集
    还有哪里不对啊?你的帖子我看了,也基本上能明白是怎么回事
    但是我都问题还是没有解决
      

  22.   

     
     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"/>如还是????再上来说一声
      

  23.   

    1、按照您交的
    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标签放在第一行了
      

  24.   

    我也不知道了,url在公网上吗?可以看见吗?
      

  25.   

    数据库连接类
    <?phpfunction db_connect() {  $db = new mysqli('localhost', 'root', '111', 'dl_manager');
    ....
    function get_result($query){$conn=db_connect();
    mysql_query('SET NAMES UTF8');你的语言设置并没有生效,因为你使用的是 mysqli 扩展
      

  26.   

    在数据库里面,敲 set gbk;
    ok.
      

  27.   

    光敲mysql_query('SET NAMES UTF8');是没用的
      

  28.   

    先在shell下查看 set names utf-8;是否乱,若是乱了,你的存的时候就存乱了
    把每个varchar字段也改为utf8-genial-ci
    若没乱,见#38
      

  29.   

    读库是SET CHARACTERSET GBK或者UTF-8
    写库是SET NANES  GBK或者UTF-8
      

  30.   

    #修改数据库字符集 
    alter database 数据库名 default character set 'utf8';#修改数据表字符集
    alter table 表名 default character set 'utf8';#查询之前加上
    mysql_query("SET NAMES utf8");
      

  31.   

    http://www.laruence.com/2008/01/05/12.html可以参阅下上面的文章,里面有一段:• 向默认字符集为latin1的数据表插入utf8编码的数据前设置了连接字符集为utf8– 插入时根据连接字符集设置,character_set_client、character_set_connection和character_set_results均为utf8;– 插入数据将经过utf8=>utf8=>latin1的字符集转换,若原始数据中含有\u0000~\u00ff范围以外的Unicode字 符,会因为无法在latin1字符集中表示而被转换为“?”(0x3F)符号,以后查询时不管连接字符集设置如何都无法恢复其内容了。
      

  32.   

    如果楼主用phpmyadmin的话,把库,表,字段的整理统一设置为utf8_unicode_ci。新插入数据。然后取数据时务必SET NANES UTF8;   不是UTF-8!!切记!我以前就范过这个错误,也是显示问号。显示数据的网页那里设置为<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">然后就没有然后了。。亲身经历把问号变为正常中文。
      

  33.   

    你从phpmydsql里面直接插入的数据就会这个样子,你手动写进去的,谁也保证不了是什么原因,你试着用PHP往里面插入数据,再读出,应该就不会有这个问题了
      

  34.   

    又是编码问题。。数据库编码
    数据库操作编码
    网页header编码
    网页本身文件的编码这几点保持一致。
      

  35.   


    很多时候,数据库中 phpmyadmin中是显示正常,如果按照几位版主的说法,如果用控制台查看,我想楼上的问题出在控制台本身显示编码为GBK,所以问题并非数据库中的数据,所以仅仅是控制台显示问题,将
    显示设置为 set character_set_result=gbk;  中文应该能正常显示
      

  36.   

    mysql_select_db('test',$con);
    mysql_query('set names gb2312');
    这句非常有问,我的问号,把utf8改成gb2312问号就变友中文了。
      

  37.   

    mysql_select_db('test',$con);
    mysql_query('set names gb2312');
    在选择数据库后加这句【mysql_query('set names gb2312');】非常有用,我的问号,把utf8改成gb2312问号就变成中文了。
    记住name是要加s结尾不然还会显示问号。