环境
WIN7 64位;PHP5.3.13+Apache+ SQL Server 2005;利用系统DSN数据源+ODBC连接数据库;zend studio, UTF-8;
问题
当处理中文信息时,插入数据库中的数据为乱码,读取到的数据显示在网页上也是乱码。
解决方案
方案一
手工实现代码转换:
在HTML文件中一定要指定编码为UTF-8(GBK),否则会出现插入的数据没问题,便读取后显示在网页上的数据还是乱码。具体实现有两种方式:
方法一:直接在HTML中加入:
方法二:在PHP中加入
测试代码见另一篇博文:http://blog.csdn.net/taotaoyouarebaby/article/details/8259381
http://blog.csdn.net/gumanren/article/details/4691820
//写入:UTF-8 转 GBK
function gbk2utf8($str)
{
return iconv('gbk', 'utf-8//IGNORE', $str);
}
//读取:GBK 转 UTF-8
function utf82gbk($str)
{
return iconv('utf-8', 'gbk//IGNORE', $str);
}
注意:
在HTML文件中一定要指定编码为UTF-8(
方法一:直接在HTML中加入:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>PHP + SQL SERVER2005</title></head>
方法二:在PHP中加入
header("Content-type: text/html; charset=UTF-8");
完整的测试代码:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>SQL SERVER 2005 DB Test<
</title>
</head>
<body>
<h1 align="center">SQL SERVER 2005 DB Test</h1>
<?php
function gbk2utf8($str)
{
return iconv('gbk', 'utf-8//IGNORE', $str);
}
function utf82gbk($str)
{
return iconv('utf-8', 'gbk//IGNORE', $str);
}
//之前已经建立好了系统DSN数据源:DBSTestAccess
$conn = odbc_connect ("DBSTestAccess" , "", "", SQL_CUR_USE_ODBC );
//在数据库中已经建好一个表book
$insertSql = 'INSERT INTO book (name, total) VALUES (\''.utf82gbk('测试28').'\', 100)';
odbc_exec($conn, $insertSql);
$sql = "select * from book";
$rs = odbc_do ( $conn, $sql );
while ( odbc_fetch_row ( $rs ) ) {
print "book名称:" .gbk2utf8(odbc_result ( $rs, "name" ));
print "price:" .gbk2utf8(odbc_result ( $rs, "total" ))."<br>";
}
odbc_close ( $conn );
?>
</body>
</html>
方案二
将PHP代码、网页、数据库的编码都改为gbk或gb2312。这种方案更好。
PHP代码:
在Zend Studio中选 windows->preferences->General->Workspace->Text file encoding,设置为GBK。
或者直接用文本编辑器将xxx.php文件转码为ANSI编码文档即可。
网页
<meta http-equiv="Content-Type" content="text/html; charset=gbk"> 或 <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
数据库:不用改动,其中文编码就是gbk
测试代码见另一篇博文:http://blog.csdn.net/taotaoyouarebaby/article/details/8259381
附:数据库环境建立
USE [exp_db]
GO
/****** 对象: Table [dbo].[book] 脚本日期: 12/02/2012 11:33:15 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[book](
[name] [nchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
[total] [int] NOT NULL
) ON [PRIMARY]
参考:
http://blog.csdn.net/gumanren/article/details/4691820