PHP+SQL_SERVER 2005の乱符号化ソリューション

3091 ワード

環境
WIN 7 64ビット;PHP5.3.13+Apache+ SQL Server 2005;システムDSNデータソース+ODBCを利用してデータベースに接続する.zend studio, UTF-8;
に質問
中国語情報を処理する場合、データベースに挿入されたデータは文字化けし、読み込まれたデータはウェブページに表示されても文字化けしている.
ソリューション
シナリオ1
コード変換を手動で実行するには、次の手順に従います.
//  :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)としてエンコードするように指定してください.そうしないと、挿入されたデータに問題がなく、読み込んだ後にページに表示されるデータが文字化けしてしまいます.具体的な実現には2つの方法があります.
方法1:HTMLに直接追加する:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>PHP + SQL SERVER2005</title></head>
	

方法2: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>

シナリオ2
PHPコード、ウェブページ、データベースの符号化は、gbkまたはgb 2312に変更される.この案はもっとよい.
PHPコード:
Zend Studioでwindows->preferences->General->Workspace->Text file encodingを選択し、GBKに設定します.
あるいは直接テキストエディタでxxxを使用します.phpファイルはANSI符号化ドキュメントにトランスコードすればよい.
Webページ
<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