PHP与SQL Server处理维吾尔文的方法研究

2015-05-30 10:48贾志先
智能计算机与应用 2015年5期

摘 要: 在PHP中,默认情况下,访问SQL Server方式存在着不支持UTF-8字符集的问题。对PHP系统和代码进行适当的修改和扩展后,将SQL Server的数据集(CharacterSet)设为UTF-8,使PHP访问SQL Server的mssql、adodb方式支持UTF-8字符集,解决了应用PHP与SQL Server处理维吾尔文数据的问题。

关键词: PHP; SQL Server; 维吾尔文

中图分类号:TP391.1 文献标识码: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 引言

维吾尔语属于阿尔泰系突厥语族,在形态结构上属黏着语类型。现代维吾尔文是一种拼音式文字,从右向左书写。现代维吾尔文有32个字母,表示32个音素,包括8个元音和24个辅音。现代维吾尔文字体分为独立书体、简化独立书体、前连书体、前后连书体、后连书体和简化后连书体等字体。在现代维吾尔文中,一个字母最少有两种不同的字体符号,最多有8种不同的字体符号,32个字母共有126种不同的字体符号。

目前,维吾尔文字符采用Unicode编码。在PHP中,常用的访问SQL Server方式有mssql、odbc和adodb等。在默认情况下,这些访问SQL Server方式不支持Unicode编码,无法应用PHP与SQL Server处理维吾尔文。

下面,通过对PHP中访问SQL Server的mssql、adodb方式进行讨论,使mssql、adodb访问SQL Server方式支持UTF-8字符集(UTF-8是一种针对Unicode的可变长度字符编码),给出PHP与SQL Server处理维吾尔文的方法,并应用到维吾尔语考试阅卷系统开发中。

1 维吾尔文的编码

Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1 114 112个字符。在Unicode中,维吾尔文126种不同的字体符号被分配到阿拉伯字符基本区,扩展区A和扩展区B。[1]

在Unicode中,阿拉伯字符编码分布为:

阿拉伯文(0600H––06FFH);

增补阿拉伯文(0750H––077FH);

阿拉伯文语境表达方式字符集A(FB50H––FDFFH);

阿拉伯文语境表达方式字符集B(FE70H––FEFFH)。

UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码。在电子邮件、网页及其他存储或发送文字的应用中,UTF-8逐渐成为优先采用的编码。

UTF-8使用一至六个字节按如下规则为每个字符编码:

(1)128个ASCII字符,每个字符只需一个字节编码(Unicode范围由0000H至007FH)。

(2)带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母,每个字符需要两个字节编码(Unicode范围由0080H至07FFH)。

(3)其他基本多文种平面(BMP)中的字符(这包含了大部分常用字),每个字符需要使用三个字节编码(Unicode范围由0800H至FFFFH)。

(4)其他极少使用的Unicode 辅助平面的字符使用四至六字节编码。

可以看出,在UTF-8编码中,一部分被分配到阿拉伯字符基本区的维吾尔文字符,采用两个字节编码,其它被分配到阿拉伯字符扩展区A和扩展区B的维吾尔文字符,采用三个字节编码。

2 PHP中显示维吾尔文的字符集选择

在计算机字符编码中,有多种不同的字符编码方案。在网页中选择能够正常显示维吾尔语文字的字符编码是网页设计中的一个重要的问题。

在PHP网页设计中,选择UTF-8作为网页的字符集,可以解决维吾尔文的显示问题。实现的方法为:

(1)在静态页面代码中,加入:

(2)在PHP代码中,加入:

header( "Content-type: text/html; charset=utf-8" );

3 SQL Server数据库存储维吾尔文的字段类型选择

在不支持Unicode字符集的情况下,从SQL Server数据库存取数据时,维吾尔文数据将被转换为一系列问号“?”。例如, (新疆维吾尔语水平等级考试)被转换为“?????? ?????? ???? ?????? ?????????”。

产生这一问题的原因是由于在不支持Unicode字符集的情况下,用Unicode代码表示的维吾尔文字符被映射为ANSI代码,在映射过程中出现编码映射错误,导致维吾尔文字符被转换为“?”。

在SQL Server中,数据库表具有多种字段类型,其中,char、varchar、text字段类型可以存储非Unicode数据类型的字符。nchar、nvarchar、ntext字段类型可以存储Unicode数据类型的字符。

在SQL Server的数据库表中,对于存储维吾尔文的字段,选择nchar、nvarchar、ntext等可以存储Unicode数据的字段类型,即可解决维吾尔文的存储问题。

4 PHP访问SQL Server数据库中维吾尔文数据的方式

在PHP中,常用的访问SQL Server方式有mssql、odbc和adodb等。對PHP系统和代码进行适当的修改和扩展后,mssql、adodb访问SQL Server方式可以支持UTF-8字符集,从而实现访问SQL Server数据库中的维吾尔文数据。

4.1 mssql方式访问SQL Server

PHP提供了对SQL Server的支持,应用mssql方式可以访问SQL Server。但是,从PHP 5.3版本开始,PHP不再提供php_mssql模块,需要利用微软发布的驱动程序SQL Server Driver for PHP。

对应不同的PHP版本,微软提供了相应的mssql模块。在PHP加载微软的mssql模块过程中,由于版本不兼容,会出现加载出错的情况。因此,在安装mssql模块时,要注意PHP和微软的mssql模块版本之间的一致性。例如,笔者使用的一个PHP版本是:

XAMPP 1.8.2

PHP 5.4.31

对应的微软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服务器的配置信息。如果微软的mssql模块加载成功,会看到如图1中的SQL Server配置部分。[2]

图1 SQL Server配置部分

Fig.1: SQL Server configuration settings page

在连接SQL Server数据库的代码中增加"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数据库名,用户名和密码。

4.2 adodb方式访问SQL Server

ADODB(Active Data Objects Data Base)是存取数据库所使用到的一组函数。在PHP中,提供了与微软的ADODB相似的语法功能[3]。应用adodb方式访问SQL Server,需要从http://sourceforge.net/projects/adodb网站上下载和安装adodb包。将adodb包解压缩到网页所在的文件夹下,并修改adodb5\drivers文件夹下adodb-mssqlnative.inc.php文件中的_connect()函数:

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()函数中的$connectionInfo["PWD"]=$argPassword;语句后,增加一条$connectionInfo["CharacterSet"]="utf-8";语句。其功能是设置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()函数功能是连接数据库,'mssqlnative'是连接SQL Server的数据库驱动程序名称。Connect()函数功能是实现与数据库的连接,$dbhost, $dbuser, $dbpass和$dbname分别为SQL Server数据库的服务器IP地址,用户名,密码和数据库名。

在以上两种PHP访问SQL Server方法中,支持UTF-8字符集的关键是在连接SQL Server时,设置SQL Server的字符集CharacterSet为UTF-8。

5 PHP与SQL Server之间编码的转换

在PHP访问SQL Server过程中,当连接SQL Server的字符集设为UTF-8编码时,SQL语句需要使用UTF-8编码,返回的数据集的字段名需要使用GB-2312编码。因此,在PHP网页设计过程中,需要应用iconv ()函数进行编码转换。[4]

在网页设计过程中,要注意PHP文件的存储格式。当转换文件格式后,要调整文件中SQL语句和数据集字段名的编码。

例如,在维吾尔语考试阅卷系统中,应用adodb方式访问SQL Server,查询“试题1”表,返回“题号”和“答案”字段值。

1)当网页文件格式为UTF-8时,查询语句为:

$Strsql = "SELECT * FROM 试题1";

$rs = $conn->Execute($Strsql);

“题号”和“答案”字段表达式为:

$rs->fields[iconv("utf-8","gb2312",'题号')];

$rs->fields[iconv("utf-8","gb2312",'答案')];

2)当网页文件格式为ANSI时,查询语句为:

$Strsql = "SELECT * FROM 试题1";

$rs = $conn->Execute(iconv("gb2312","utf-8",$Strsql));

“题号”和“答案”字段表达式为:

$rs->fields['题号'];

$rs->fields['答案'];

6 结束语

本文是对[5]的补充和完善,在[5]中,由于尚未搞清mssql、adodb访问SQL Server方式支持UTF-8字符集的问题,在维吾尔语口试评卷系统的网页设计中,采用图像方式显示维吾尔文试题和答案。

在PHP访问SQL Server的mssql、adodb方式支持UTF-8字符集这一问题解决后,应用PHP与SQL Server处理维吾尔文数据的问题也相应地得到了解决。在维吾尔语口试评卷系统中,应用mssql、adodb方式访问SQL Server数据库中维吾尔文数据,取得了很好的结果。

参考文献:

[1] 维尼拉·木沙江,艾尔肯·伊米尔.维吾尔文Unicode在线处理技术与实现[J].新疆大学学报(自然科学版), 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](第二版).北京:清华大学出版社,2010.

[4] 陈军红,王瑞敬.PHP编程从基础到应用[M].北京:清华大学出版社,2014.

[5] 贾志先.维吾尔语口试阅卷系统开发中若干问题的研究[J].智能计算机与应用,2015,5(4):30-32.