您的位置:首页 > 编程语言 > PHP开发

PHP+SQL_SERVER2005之乱码解决方案

2012-12-02 12:32 363 查看

环境

WIN7 64位;PHP5.3.13+Apache+ SQL Server 2005;利用系统DSN数据源+ODBC连接数据库;zend studio, UTF-8;

问题

当处理中文信息时,插入数据库中的数据为乱码,读取到的数据显示在网页上也是乱码。

解决方案

方案一

手工实现代码转换:

//写入: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(GBK),否则会出现插入的数据没问题,便读取后显示在网页上的数据还是乱码。具体实现有两种方式:

方法一:直接在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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐