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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值