زیک
مسافر
ہم 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 باقی بچی۔ اس میں یہ مسئلہ تھا کہ جب میں نے اس فائل میں یہ دو لائنیں ڈالیں
تو کوئی فرق نہیں پڑا۔ اس کی وجہ یہ تھی کہ ہمارے سرور پر پیایچپی cgi کے طور پر چل رہی تھی جبکہ ان دو لائنوں کے کام کرنے کے لئے ضروری ہے کہ پیایچپی apache module کے طور پر نصب ہو۔ مرتے کیا نہ کرتے میں نے اپنے ہوسٹ کے ویبپینل میں جا کر پیایچپی کو اپاچی موڈیول پر سیٹ کر دیا۔ اس سے یہ ہوا کہ اردو بلاگ اور اردو وکی نے کام کرنا چھوڑ دیا۔ اس کی وجہ یہ تھی کہ ہمارا ہوسٹ آپ کو کئی سکرپٹ نہیں چلانے دیتا اگر آپ پیایچپی کو اپاچی موڈیول کے طور پر استعمال کریں اور سکرپٹ کی permissions زیادہ کھلی ہوں۔ فائلوں کی permissions کو 644 اور directories کی 755 ہونی چاہیئیں۔ یہ سب ٹھیک کرنے کے بعد بھی کچھ چھٹی موٹی تبدیلیاں کرنی پڑیں مگر اب سب چالو تھا۔
یہ سب تو ہوا مگر ایک کام تو رہ گیا۔ ڈیفالٹ یہ ہے کہ ڈیٹابیس latin1 میں ہوتا ہے۔ ہمارے ڈیٹابیس کا بھی یہی حال تھا۔ یہ بھی مسائل پیدا کر سکتا ہے اگرچہ بہت سے چیزیں پھر بھی درست چلتی ہیں۔ ڈیٹابیس کو یونیکوڈ میں بدلنے کا حل میں اپنے بلاگ کے لئے تلاش کر چکا تھا۔ سو میں نے یہ کمانڈ استعمال کئے:
پھر vi میں search and replace کے ذریعہ جہاں جہاں فائل میں latin1 تھا اسے utf8 میں بدلا۔ پھر
یہ تھی میری داستان۔ اب محفل باقاعدہ صحیح طریقے سے یونیکوڈ پر ہے۔
ضرور پڑھیں: PHP and Internationalization
پیایچپی کے 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