پی‌ایچ‌پی، یونیکوڈ اور سٹرنگ

زیک

مسافر
ہم php4 استعمال کر رہے ہیں حالانکہ ہمارے سرور پر php5 بھی نصب ہے۔ اس کی وجہ یہ ہے کہ php4 اس کی ڈیفالٹ ہے اور آج کل کے بہت سے پی‌ایچ‌پی پروگرام اس کے لئے بنے ہیں۔ پی‌ایچ‌پی 5 میں کئی دفعہ وہ نہیں چلتے۔ خیر دونوں ورژن کی unicode support کچھ ایک جیسی ہے یعنی ہے ہی نہیں (سنا ہے PHP6 میں ہو گی)۔ بھلا ہو ہمارے ہوسٹ کا کہ اس نے mbstring extension نصب کی ہوئی ہے جس سے ہمیں یونیکوڈ کی سپورٹ مل جاتی ہے۔

پی‌ایچ‌پی کے string فنکشن byte-oriented ہیں کیونکہ وہ ASCII کے لئے لکھے گئے تھے۔ لہذا یونیکوڈ کو وہ صحیح پروسس نہیں کرتے۔ یہی وجہ تھی کہ اس محفل پر ہمیں اسم رکن کی لمبائی کا مسئلہ پیش آیا۔ اس کا حل میں نے یہ نکالا کہ substr کی بجائے mb_substr استعمال کیا جو یونیکوڈ جیسے multibyte character codes کے لئے لکھا گیا ہے۔ اسی مسئلے نے دوبارہ سر اٹھایا جب فورم کی فہرست میں سوالیہ نشان نظر آنے لگے۔ اس بار میں نے سوچا کہ اس کا کوئی بہتر حل کیا جائے بجائے اس کے کہ میں پی‌ایچ‌پی‌بی‌بی کے کوڈ میں تمام substr کو mb_substr میں بدل دوں۔ یہی دیکھتے ہوئے میں نے پی‌ایچ‌پی کی mbstring extension کے بارے میں پڑھنا شروع کیا۔ mb_substr فنکشن بھی اسی کا حصہ ہے۔ اس سے مجھے ایک طریقہ ملا جو میں نے محفل میں ڈال دیا ہے۔ اس کے کئی حصے ہیں۔


1. پی‌ایچ‌پی کے اندر string data کس طرح موجود ہوتا ہے؟ عام طور سے یہ ASCII یا Latin 1 میں ہوتا ہے مگر mbstring.internal_encoding کے directive کے ذریعہ آپ اس کو UTF-8 پر بھی سیٹ کر سکتے ہیں۔ یہ کام آپ php.ini، .htaccess، httpd.conf یا اپنی پی‌ایچ‌پی فائل میں ini_set فنکشن کے ذریعہ کر سکتے ہیں۔

2. دوسرا کام ہے پی‌ایچ‌پی کے سٹرنگ فنکشنز کو mbstring والے فنکشنز سے بدلنا۔ یہ کام function overloading سے ہو سکتا ہے۔ اس کے لئے بھی mbstring میں directive ہے: mbstring.func_overload۔ مگر اسے آپ اپنی فائل میں ini_set()‎ سے سیٹ نہیں کر سکتے۔ باقی طریقے اس پر بھی لاگو ہیں۔

آپ کہہ رہے ہوں گے کہ یہ تو آسان کام ہے مگر میری کہانی ابھی ختم نہیں ہوئی۔ php.ini اور httpd.conf کو ہم نہیں چھیڑ سکتے کیونکہ ہم ایک shared server پر ہیں۔ سو ‎.htaccess باقی بچی۔ اس میں یہ مسئلہ تھا کہ جب میں نے اس فائل میں یہ دو لائنیں ڈالیں

کوڈ:
PHP_VALUE mbstring.internal_encoding UTF-8
PHP_VALUE mbstring.func_overload 7

تو کوئی فرق نہیں پڑا۔ اس کی وجہ یہ تھی کہ ہمارے سرور پر پی‌ایچ‌پی cgi کے طور پر چل رہی تھی جبکہ ان دو لائنوں کے کام کرنے کے لئے ضروری ہے کہ پی‌ایچ‌پی apache module کے طور پر نصب ہو۔ مرتے کیا نہ کرتے میں نے اپنے ہوسٹ کے ویب‌پینل میں جا کر پی‌ایچ‌پی کو اپاچی موڈیول پر سیٹ کر دیا۔ اس سے یہ ہوا کہ اردو بلاگ اور اردو وکی نے کام کرنا چھوڑ دیا۔ اس کی وجہ یہ تھی کہ ہمارا ہوسٹ آپ کو کئی سکرپٹ نہیں چلانے دیتا اگر آپ پی‌ایچ‌پی کو اپاچی موڈیول کے طور پر استعمال کریں اور سکرپٹ کی permissions زیادہ کھلی ہوں۔ فائلوں کی permissions کو 644 اور directories کی 755 ہونی چاہیئیں۔ یہ سب ٹھیک کرنے کے بعد بھی کچھ چھٹی موٹی تبدیلیاں کرنی پڑیں مگر اب سب چالو تھا۔

یہ سب تو ہوا مگر ایک کام تو رہ گیا۔ ڈیفالٹ یہ ہے کہ ڈیٹابیس latin1 میں ہوتا ہے۔ ہمارے ڈیٹابیس کا بھی یہی حال تھا۔ یہ بھی مسائل پیدا کر سکتا ہے اگرچہ بہت سے چیزیں پھر بھی درست چلتی ہیں۔ ڈیٹابیس کو یونیکوڈ میں بدلنے کا حل میں اپنے بلاگ کے لئے تلاش کر چکا تھا۔ سو میں نے یہ کمانڈ استعمال کئے:

کوڈ:
mysqldump -h host --user=username -p --default-character-set=latin1 --skip-set-charset dbname > dump.sql

پھر vi میں search and replace کے ذریعہ جہاں جہاں فائل میں latin1 تھا اسے utf8 میں بدلا۔ پھر

کوڈ:
mysql -h host --user=username -p --execute="DROP TABLE tablenames; ALTER DATABASE dbname DEFAULT CHARACTER SET utf8;"
mysql -h host --user=username -p --default-character-set=utf8 dbname <dump>db_connect_id);‎

یہ تھی میری داستان۔ اب محفل باقاعدہ صحیح طریقے سے یونیکوڈ پر ہے۔

ضرور پڑھیں: PHP and Internationalization
 
ایچ ٹی ایم ایل ریفرینسنگ

میں نے اپنی اردو ویب سائٹ کو ایچ ٹی ایم ایل ریفرینسنگ
کوڈ:
‎(&#1583)‎
کی مدد سے بنایا ہے۔ آپ کے خیال میں یونیکوڈ کے طریقے اور اس طریقے میں کیا فرق ہے۔
 

زیک

مسافر
شارق: سب سے پہلے تو یہ کہ میں نے آپ کی تحریر میں ردوبدل کر کے اسے صحیح کر دیا ہے یونیکوڈ کنٹرول حروف کی مدد سے۔ اس بارے میں بعد میں لکھوں گا۔

Numeric character reference (NCR)‎ کے استعمال میں کئی مسائل ہیں۔ پہلی بات تو یہ کہ یہ زیادہ جگہ لیتے ہیں۔ مثلاً اردو کے یونیکوڈ حروف دو بائٹ کے ہوتے ہیں مگر NCR سات بائٹ۔ پھر آپ کا سورس پڑھا نہیں جا سکتا۔ HTML اور XML کے علاوہ کوئی اور سسٹم ان کو پڑھ نہیں سکتا۔ لہذا آپ بہت سی character processing نہیں کر سکتے۔ اگر آپ اپنے ڈیٹابیس میں NCR رکھتے ہیں تو ڈیٹابیس میں تلاش مشکل ہو جاتی ہے۔ اگر آپ کسی string میں سے substring نکالنا چاہتے ہیں تو آپ کو NCRs کو پہلے حروف میں decode کرنا پڑے گا۔ جہاں تک میرا علم ہے php4 میں یہ decoding ممکن نہیں۔ اسی طرح آپ ہر وقت encode اور decode کے چکر میں پڑے رہیں گے کیونکہ ردوبدل کرتے وقت آپ حروف دیکھنا چاہتے ہیں نہ کہ NCR۔

NCRs کا ایک فائدہ یہ ہے کہ آپ کا صفحہ کسی بھی encoding میں ہو سکتا ہے مثلاً اگر آپ کا صفحہ ISO-8859-1 میں ہے اور آپ کچھ یونیکوڈ کے حروف دکھانا چاہتے ہیں تو آپ کے پاس NCR کے علاوہ کوئی چارہ کار نہیں۔

نعیم: شکریہ۔
 
انکوڈنگ

زکریا آپ کی پوسٹ اور پی ڈی ایف فائل سے انکوڈنگ وغیرہ کے معاملات سمجھنے میں مدد ملی ہے۔ جب ویب سائٹ تیار کر رہا تھا تو پہلا حل جو سمجھ میں آیا اسی پر عملدرآمد کر بیٹھا۔

یہ سن کر دکھ ہوا کہ پی ایچ پی 5 جو بڑے دھوم دھڑکے سے آئی تھی اس میں بھی یونی کوڈ کی سپورٹ نہیں ہے۔
 

زیک

مسافر
ایک اور مسئلہ

شکریہ شارق۔

php میں یونیکوڈ سپورٹ نہ ہونے کی وجہ سے ایک اور مشکل بھی پیش آئی۔ اس کی وجہ URLs کی autolinking تھی۔ include/bbcode.php میں اس کے لئے فنکشن ہے make_clickable جس میں preg_replace کے ذریعہ کسی بھی URL کو ایک باقاعدہ ربط میں بدل دیا جاتا ہے۔ افسوس کہ preg_replace یونیکوڈ کو آسانی سے نہیں مانتا۔ اس کے لئے آپ کو regular expression کے آخر میں "u" لگانا پڑتا ہے کہ بھائی یہ یونیکوڈ ہے۔ اب یہ نہیں پتہ کہ preg_replace اور preg_match وغیرہ اور کیا کیا ستم ڈھائیں گے کیونکہ ان کا phpbb میں بے‌دریغ استعمال کیا گیا ہے۔
 

زیک

مسافر
نبیل یہ بلاگ پوسٹ تو پرانی ہے۔ جیک ڈسٹلر سے میری بات چیت ہے جس کی پوسٹ پر یہ تبصرہ ہے۔ اس لئے دیکھی تھی۔
 

نبیل

تکنیکی معاون
زکریا، اور لوگوں کو بھی یہ مسائل در پیش ہیں۔ میرے خیال میں پی ایچ پی بی بی والوں سے درخواست کرنی چاہیے کہ وہ اپنے اگلے ورژن میں برائے مہربانی یونیکوڈ کی سپورٹ شامل کردی۔
 

زیک

مسافر
میرا خیال ہے میری تحریر کی انگریزی ورژن لکھ کر کہیں ڈال دینی چاہیئے تاکہ لوگوں کے کام آئے۔
 

نبیل

تکنیکی معاون
زکریا، میں آپ کی تحریر کا انگریزی ترجمہ کرکے پی ایچ پی بی بی کی آفیشل سپورٹ سائٹ پر پوسٹ تو کردوں گا لیکن اس پر جو سوالات اٹھیں گے ان کے جوابات کون دے گا؟
 

زیک

مسافر
میں سوچ رہا ہوں کہ خود اس کا ترجمہ کر کے اپنے بلاگ پر ڈال دوں۔ پھر اس کا ربط phpbb کے فورم پر ڈالا جا سکتا ہے۔ مگر یہ ہفتہ بہت مصروف ہے اور اس کے بعد انٹرنیٹ پر آیا تو والدین کچھ پسند نہیں کریں گے۔ لگتا ہے جنوری تک انتظار کرنا پڑے گا۔
 
Top