PHP+SQL_SERVER2005之亂碼解決方案

環境

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章