摘 要: 在PHP中,默認(rèn)情況下,訪問SQL Server方式存在著不支持UTF-8字符集的問題。對PHP系統(tǒng)和代碼進行適當(dāng)?shù)男薷暮蛿U展后,將SQL Server的數(shù)據(jù)集(CharacterSet)設(shè)為UTF-8,使PHP訪問SQL Server的mssql、adodb方式支持UTF-8字符集,解決了應(yīng)用PHP與SQL Server處理維吾爾文數(shù)據(jù)的問題。
關(guān)鍵詞: PHP; SQL Server; 維吾爾文
中圖分類號:TP391.1 文獻標(biāo)識碼:A 文章編號:2095-2163(2015)05-
The Application of PHP and SQL Server in the Data Processing of Uyghur character
JIA Zhi-xian
(Network and Experimental Teaching Center, Xinjiang University of Finance and Economics)
Abstract: In PHP, there is a problem that does not support the UTF-8 character set in the method of access SQL Server, by default. The paper has appropriate modifications and extensions to the PHP system and code, and set up the CharacterSet of SQL Server for UTF-8, which can make the method of mssql and addodb access to SQL Server to support UTF-8 character set. Finally the paper can solve the problem of data processing of Uyghur character with PHP and SQL Server.
Key Words: PHP; SQL Server; Uyghur character
0 引言
維吾爾語屬于阿爾泰系突厥語族,在形態(tài)結(jié)構(gòu)上屬黏著語類型?,F(xiàn)代維吾爾文是一種拼音式文字,從右向左書寫?,F(xiàn)代維吾爾文有32個字母,表示32個音素,包括8個元音和24個輔音。現(xiàn)代維吾爾文字體分為獨立書體、簡化獨立書體、前連書體、前后連書體、后連書體和簡化后連書體等字體。在現(xiàn)代維吾爾文中,一個字母最少有兩種不同的字體符號,最多有8種不同的字體符號,32個字母共有126種不同的字體符號。
目前,維吾爾文字符采用Unicode編碼。在PHP中,常用的訪問SQL Server方式有mssql、odbc和adodb等。在默認(rèn)情況下,這些訪問SQL Server方式不支持Unicode編碼,無法應(yīng)用PHP與SQL Server處理維吾爾文。
下面,通過對PHP中訪問SQL Server的mssql、adodb方式進行討論,使mssql、adodb訪問SQL Server方式支持UTF-8字符集(UTF-8是一種針對Unicode的可變長度字符編碼),給出PHP與SQL Server處理維吾爾文的方法,并應(yīng)用到維吾爾語考試閱卷系統(tǒng)開發(fā)中。
1 維吾爾文的編碼
Unicode是國際組織制定的可以容納世界上所有文字和符號的字符編碼方案。Unicode用數(shù)字0-0x10FFFF來映射這些字符,最多可以容納1 114 112個字符。在Unicode中,維吾爾文126種不同的字體符號被分配到阿拉伯字符基本區(qū),擴展區(qū)A和擴展區(qū)B。[1]
在Unicode中,阿拉伯字符編碼分布為:
阿拉伯文(0600H––06FFH);
增補阿拉伯文(0750H––077FH);
阿拉伯文語境表達(dá)方式字符集A(FB50H––FDFFH);
阿拉伯文語境表達(dá)方式字符集B(FE70H––FEFFH)。
UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字符編碼。在電子郵件、網(wǎng)頁及其他存儲或發(fā)送文字的應(yīng)用中,UTF-8逐漸成為優(yōu)先采用的編碼。
UTF-8使用一至六個字節(jié)按如下規(guī)則為每個字符編碼:
(1)128個ASCII字符,每個字符只需一個字節(jié)編碼(Unicode范圍由0000H至007FH)。
(2)帶有附加符號的拉丁文、希臘文、西里爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文及它拿字母,每個字符需要兩個字節(jié)編碼(Unicode范圍由0080H至07FFH)。
(3)其他基本多文種平面(BMP)中的字符(這包含了大部分常用字),每個字符需要使用三個字節(jié)編碼(Unicode范圍由0800H至FFFFH)。
(4)其他極少使用的Unicode 輔助平面的字符使用四至六字節(jié)編碼。
可以看出,在UTF-8編碼中,一部分被分配到阿拉伯字符基本區(qū)的維吾爾文字符,采用兩個字節(jié)編碼,其它被分配到阿拉伯字符擴展區(qū)A和擴展區(qū)B的維吾爾文字符,采用三個字節(jié)編碼。
2 PHP中顯示維吾爾文的字符集選擇
在計算機字符編碼中,有多種不同的字符編碼方案。在網(wǎng)頁中選擇能夠正常顯示維吾爾語文字的字符編碼是網(wǎng)頁設(shè)計中的一個重要的問題。
在PHP網(wǎng)頁設(shè)計中,選擇UTF-8作為網(wǎng)頁的字符集,可以解決維吾爾文的顯示問題。實現(xiàn)的方法為:
(1)在靜態(tài)頁面代碼中,加入:
(2)在PHP代碼中,加入:
header( "Content-type: text/html; charset=utf-8" );
3 SQL Server數(shù)據(jù)庫存儲維吾爾文的字段類型選擇
在不支持Unicode字符集的情況下,從SQL Server數(shù)據(jù)庫存取數(shù)據(jù)時,維吾爾文數(shù)據(jù)將被轉(zhuǎn)換為一系列問號“?”。例如, (新疆維吾爾語水平等級考試)被轉(zhuǎn)換為“?????? ?????? ???? ?????? ?????????”。
產(chǎn)生這一問題的原因是由于在不支持Unicode字符集的情況下,用Unicode代碼表示的維吾爾文字符被映射為ANSI代碼,在映射過程中出現(xiàn)編碼映射錯誤,導(dǎo)致維吾爾文字符被轉(zhuǎn)換為“?”。
在SQL Server中,數(shù)據(jù)庫表具有多種字段類型,其中,char、varchar、text字段類型可以存儲非Unicode數(shù)據(jù)類型的字符。nchar、nvarchar、ntext字段類型可以存儲Unicode數(shù)據(jù)類型的字符。
在SQL Server的數(shù)據(jù)庫表中,對于存儲維吾爾文的字段,選擇nchar、nvarchar、ntext等可以存儲Unicode數(shù)據(jù)的字段類型,即可解決維吾爾文的存儲問題。
4 PHP訪問SQL Server數(shù)據(jù)庫中維吾爾文數(shù)據(jù)的方式
在PHP中,常用的訪問SQL Server方式有mssql、odbc和adodb等。對PHP系統(tǒng)和代碼進行適當(dāng)?shù)男薷暮蛿U展后,mssql、adodb訪問SQL Server方式可以支持UTF-8字符集,從而實現(xiàn)訪問SQL Server數(shù)據(jù)庫中的維吾爾文數(shù)據(jù)。
4.1 mssql方式訪問SQL Server
PHP提供了對SQL Server的支持,應(yīng)用mssql方式可以訪問SQL Server。但是,從PHP 5.3版本開始,PHP不再提供php_mssql模塊,需要利用微軟發(fā)布的驅(qū)動程序SQL Server Driver for PHP。
對應(yīng)不同的PHP版本,微軟提供了相應(yīng)的mssql模塊。在PHP加載微軟的mssql模塊過程中,由于版本不兼容,會出現(xiàn)加載出錯的情況。因此,在安裝mssql模塊時,要注意PHP和微軟的mssql模塊版本之間的一致性。例如,筆者使用的一個PHP版本是:
XAMPP 1.8.2
PHP 5.4.31
對應(yīng)的微軟mssql模塊是:
php_sqlsrv_54_ts.dll 2012/8/28 201KB
php_pdo_sqlsrv_54_ts.dll 2012/8/28 183KB
將php_sqlsrv_54_ts.dll,php_pdo_sqlsrv_54_ts.dll存儲到C:\xampp\php\ext文件夾下。修改C:\xampp\php下的php.ini文件,在php.ini文件的Dynamic Extensions部分,增加:
extension=php_sqlsrv_54_ts.dll
extension=php_pdo_sqlsrv_54_ts.dll
在PHP中可以利用代碼<?php phpinfo(); ?>顯示php服務(wù)器的配置信息。如果微軟的mssql模塊加載成功,會看到如圖1中的SQL Server配置部分。[2]
圖1 SQL Server配置部分
Fig.1: SQL Server configuration settings page
在連接SQL Server數(shù)據(jù)庫的代碼中增加"CharacterSet"=>"utf-8"(表示SQL Server的字符集為UTF-8編碼),如:
$coninfo=array("Database"=>$dbname,"UID"=>$dbuser,"PWD"=>$dbpass,"CharacterSet"=>"utf-8");
$conn=sqlsrv_connect($dbhost,$coninfo) or die ("連接失??!");
即可支持UTF-8字符集。其中,$dbname, $dbuser和$dbpass分別為SQL Server數(shù)據(jù)庫名,用戶名和密碼。
4.2 adodb方式訪問SQL Server
ADODB(Active Data Objects Data Base)是存取數(shù)據(jù)庫所使用到的一組函數(shù)。在PHP中,提供了與微軟的ADODB相似的語法功能[3]。應(yīng)用adodb方式訪問SQL Server,需要從http://sourceforge.net/projects/adodb網(wǎng)站上下載和安裝adodb包。將adodb包解壓縮到網(wǎng)頁所在的文件夾下,并修改adodb5\drivers文件夾下adodb-mssqlnative.inc.php文件中的_connect()函數(shù):
function _connect($argHostname, $argUsername, $argPassword, $argDatabasename)
{
if (!function_exists('sqlsrv_connect')) return null;
$connectionInfo = $this->connectionInfo;
$connectionInfo["Database"]=$argDatabasename;
$connectionInfo["UID"]=$argUsername;
$connectionInfo["PWD"]=$argPassword;
… …
}
在_connect()函數(shù)中的$connectionInfo["PWD"]=$argPassword;語句后,增加一條$connectionInfo["CharacterSet"]="utf-8";語句。其功能是設(shè)置SQL Server的字符集為UTF-8編碼。
adodb方式連接SQL Server的代碼為:
<?php
include('adodb5/adodb.inc.php');// adodb5是安裝adodb包的路徑
$conn = ADONewConnection('mssqlnative');
$conn->Connect($dbhost,$dbuser,$dbpass,$dbname);
?>
其中,ADONewConnection()函數(shù)功能是連接數(shù)據(jù)庫,'mssqlnative'是連接SQL Server的數(shù)據(jù)庫驅(qū)動程序名稱。Connect()函數(shù)功能是實現(xiàn)與數(shù)據(jù)庫的連接,$dbhost, $dbuser, $dbpass和$dbname分別為SQL Server數(shù)據(jù)庫的服務(wù)器IP地址,用戶名,密碼和數(shù)據(jù)庫名。
在以上兩種PHP訪問SQL Server方法中,支持UTF-8字符集的關(guān)鍵是在連接SQL Server時,設(shè)置SQL Server的字符集CharacterSet為UTF-8。
5 PHP與SQL Server之間編碼的轉(zhuǎn)換
在PHP訪問SQL Server過程中,當(dāng)連接SQL Server的字符集設(shè)為UTF-8編碼時,SQL語句需要使用UTF-8編碼,返回的數(shù)據(jù)集的字段名需要使用GB-2312編碼。因此,在PHP網(wǎng)頁設(shè)計過程中,需要應(yīng)用iconv ()函數(shù)進行編碼轉(zhuǎn)換。[4]
在網(wǎng)頁設(shè)計過程中,要注意PHP文件的存儲格式。當(dāng)轉(zhuǎn)換文件格式后,要調(diào)整文件中SQL語句和數(shù)據(jù)集字段名的編碼。
例如,在維吾爾語考試閱卷系統(tǒng)中,應(yīng)用adodb方式訪問SQL Server,查詢“試題1”表,返回“題號”和“答案”字段值。
1)當(dāng)網(wǎng)頁文件格式為UTF-8時,查詢語句為:
$Strsql = "SELECT * FROM 試題1";
$rs = $conn->Execute($Strsql);
“題號”和“答案”字段表達(dá)式為:
$rs->fields[iconv("utf-8","gb2312",'題號')];
$rs->fields[iconv("utf-8","gb2312",'答案')];
2)當(dāng)網(wǎng)頁文件格式為ANSI時,查詢語句為:
$Strsql = "SELECT * FROM 試題1";
$rs = $conn->Execute(iconv("gb2312","utf-8",$Strsql));
“題號”和“答案”字段表達(dá)式為:
$rs->fields['題號'];
$rs->fields['答案'];
6 結(jié)束語
本文是對[5]的補充和完善,在[5]中,由于尚未搞清mssql、adodb訪問SQL Server方式支持UTF-8字符集的問題,在維吾爾語口試評卷系統(tǒng)的網(wǎng)頁設(shè)計中,采用圖像方式顯示維吾爾文試題和答案。
在PHP訪問SQL Server的mssql、adodb方式支持UTF-8字符集這一問題解決后,應(yīng)用PHP與SQL Server處理維吾爾文數(shù)據(jù)的問題也相應(yīng)地得到了解決。在維吾爾語口試評卷系統(tǒng)中,應(yīng)用mssql、adodb方式訪問SQL Server數(shù)據(jù)庫中維吾爾文數(shù)據(jù),取得了很好的結(jié)果。
參考文獻:
[1] 維尼拉·木沙江,艾爾肯·伊米爾.維吾爾文Unicode在線處理技術(shù)與實現(xiàn)[J].新疆大學(xué)學(xué)報(自然科學(xué)版), 2004,21(3):332-334.
[2] Tali Smith. Install the SQL Server Driver for PHP [EB/OL].http://www.iis.net/learn/application-frameworks/install-and-configure-php-on-iis/install-the-sql-server-driver-for-php.2009-11-15.
[3] 潘凱華,劉中華等編著.PHP從入門到精通[M](第二版).北京:清華大學(xué)出版社,2010.
[4] 陳軍紅,王瑞敬.PHP編程從基礎(chǔ)到應(yīng)用[M].北京:清華大學(xué)出版社,2014.
[5] 賈志先.維吾爾語口試閱卷系統(tǒng)開發(fā)中若干問題的研究[J].智能計算機與應(yīng)用,2015,5(4):30-32.