网站开发笔记:PHP oci连接Oracle中文乱码问题解决方案

来源:互联网 发布:mac系统flash插件 编辑:程序博客网 时间:2024/05/17 02:37

正如一位大牛说的,最让程序员头疼的事就是文字编码问题,西方英文世界很多解决方案都是以他们为中心开发,他们没问题,拿到天朝世界,问题就来了,本问题困扰了我一段时间,php官网的oci介绍并没有关于怎么解决中文乱码问题。

解决重点是在连接Oracle时直接指定编码格式,而且特别注意是填写utf8,而不是常见的utf-8,

$conn = oci_connect("C##SCOTT", "tiger",$db,'utf8');

Oracle就会根据指定的编码格式输出给客户端,而不需要修改环境变量NLS_LANG和注册表中的NLS_LANG键值,否则反而会造成数据库无法运行。没想到解决起来就是这么简单,而没有想象那么复杂,问题是天煞的你能想到是utf8而不是utf-8吗?

另外在网页中,需要将得到的数据用htmlspecialchars函数处理,最好用该函数,而不是htmlentities,否则网页显示又是乱码。


示例代码

<!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><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>Only Test</title><style type="text/css">*{font-family: Consolas;font-size: 100%;}body{background-color: #eee;}table {border-collapse: collapse; border: 0; width: 80%; box-shadow: 1px 2px 3px #ccc;margin: 0px auto;top: 50px;position: relative;}td, th {border: 1px solid #666; font-size: 75%; vertical-align: baseline; padding: 4px 5px;}#container{width: 900px;height: 400px;margin: 0 auto;background-color: #fff;overflow: auto;}</style></head><body><div id="container"><?php    //echo oci_client_version();    date_default_timezone_set('PRC');    //header('Content-Type:text/html;Charset=utf-8');     define('CHARSET', 'GB2312');define('REPLACE_FLAGS', ENT_COMPAT | ENT_XHTML);putenv("NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK");//putenv("NLS_LANG=American_America.zhs16cgb231280");//putenv("NLS_LANG=AMERICAN");$db = "";$conn = oci_connect("C##SCOTT", "tiger",$db,'utf8');if(!$conn){        $e = oci_error();    trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);//echo "<p>logo failed!</p>";}else{$sql = "select * from company_info";$stmt = oci_parse($conn, $sql);oci_execute($stmt,OCI_DEFAULT);print "<table>\n";while ($row = oci_fetch_array($stmt,OCI_ASSOC)) {print '<tr>';foreach ($row as $item) {print '<td>'.htmlspecialchars($item).'</td>';}print '</tr>';}print '</table>';ocifreestatement($stmt);ocilogoff($conn);// while (oci_fetch($stmt)) {// print "<tr>\n";// print "  <td>".oci_result($stmt,"EMPNO")."</td>\n";// print "  <td>".htmlentities(oci_result($stmt,"ENAME"))."</td>\n";// print "  <td>".htmlentities(oci_result($stmt,"JOB"),ENT_HTML401,"UTF-8")."</td>\n";// print "  <td>".htmlspecialchars(oci_result($stmt,"ENAME"), ENT_COMPAT,"UTF-8")."</td>\n";// print "</tr>\n";// }print "</table>\n";}?></div></body></html>


输出结果


0 0
原创粉丝点击