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

زیک نے 'پی‌ایچ‌پی‌بی‌بی کا اردو ترجمہ' کی ذیل میں اس موضوع کا آغاز کیا، ‏نومبر 24, 2005

  1. زیک

    زیک محفلین

    مراسلے:
    37,958
    جھنڈا:
    UnitedStates
    موڈ:
    Amused
    ہم 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
     
    • پسندیدہ پسندیدہ × 1
    • زبردست زبردست × 1
  2. شارق مستقیم

    شارق مستقیم محفلین

    مراسلے:
    894
    ایچ ٹی ایم ایل ریفرینسنگ

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

    الف نظامی لائبریرین

    مراسلے:
    15,220
    جھنڈا:
    Pakistan
    موڈ:
    Cool
    الف نظامی ، مبارکباد کا شکریہ۔ صرف تصحیح کے لیے عرض کر رہا ہوں کہ درحقیقت phpbb میں یونیکوڈ کی مکمل سپورٹ کا بندوبست کیا ہے زکریا نے۔
     
  4. زیک

    زیک محفلین

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

    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. شارق مستقیم

    شارق مستقیم محفلین

    مراسلے:
    894
    انکوڈنگ

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

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

    زیک محفلین

    مراسلے:
    37,958
    جھنڈا:
    UnitedStates
    موڈ:
    Amused
    ایک اور مسئلہ

    شکریہ شارق۔

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

    نبیل محفلین

    مراسلے:
    16,631
    جھنڈا:
    Germany
    موڈ:
    Depressed
  8. زیک

    زیک محفلین

    مراسلے:
    37,958
    جھنڈا:
    UnitedStates
    موڈ:
    Amused
    نبیل یہ بلاگ پوسٹ تو پرانی ہے۔ جیک ڈسٹلر سے میری بات چیت ہے جس کی پوسٹ پر یہ تبصرہ ہے۔ اس لئے دیکھی تھی۔
     
  9. نبیل

    نبیل محفلین

    مراسلے:
    16,631
    جھنڈا:
    Germany
    موڈ:
    Depressed
    زکریا، اور لوگوں کو بھی یہ مسائل در پیش ہیں۔ میرے خیال میں پی ایچ پی بی بی والوں سے درخواست کرنی چاہیے کہ وہ اپنے اگلے ورژن میں برائے مہربانی یونیکوڈ کی سپورٹ شامل کردی۔
     
  10. زیک

    زیک محفلین

    مراسلے:
    37,958
    جھنڈا:
    UnitedStates
    موڈ:
    Amused
    میرا خیال ہے میری تحریر کی انگریزی ورژن لکھ کر کہیں ڈال دینی چاہیئے تاکہ لوگوں کے کام آئے۔
     
  11. نبیل

    نبیل محفلین

    مراسلے:
    16,631
    جھنڈا:
    Germany
    موڈ:
    Depressed
    زکریا، میں آپ کی تحریر کا انگریزی ترجمہ کرکے پی ایچ پی بی بی کی آفیشل سپورٹ سائٹ پر پوسٹ تو کردوں گا لیکن اس پر جو سوالات اٹھیں گے ان کے جوابات کون دے گا؟
     
  12. زیک

    زیک محفلین

    مراسلے:
    37,958
    جھنڈا:
    UnitedStates
    موڈ:
    Amused
    میں سوچ رہا ہوں کہ خود اس کا ترجمہ کر کے اپنے بلاگ پر ڈال دوں۔ پھر اس کا ربط phpbb کے فورم پر ڈالا جا سکتا ہے۔ مگر یہ ہفتہ بہت مصروف ہے اور اس کے بعد انٹرنیٹ پر آیا تو والدین کچھ پسند نہیں کریں گے۔ لگتا ہے جنوری تک انتظار کرنا پڑے گا۔
     
  13. الف نظامی

    الف نظامی لائبریرین

    مراسلے:
    15,220
    جھنڈا:
    Pakistan
    موڈ:
    Cool
    پی ایچ پی میں یونیکوڈ کی سپورٹ کے سلسلہ میں کہاں تک پیش رفت ہوئی ہے؟
     
  14. زیک

    زیک محفلین

    مراسلے:
    37,958
    جھنڈا:
    UnitedStates
    موڈ:
    Amused
    اس کے لئے پی‌ایچ‌پی 6 کا انتظار کرنا پڑے گا۔
     
  15. قیصرانی

    قیصرانی لائبریرین

    مراسلے:
    45,875
    جھنڈا:
    Finland
    موڈ:
    Festive
    زیادہ تو کیا تھوڑی سی بھی سمجھ نہیں‌ آئی :(
     
  16. زیک

    زیک محفلین

    مراسلے:
    37,958
    جھنڈا:
    UnitedStates
    موڈ:
    Amused
    آہ یادیں!! پی ایچ پی اور یونیکوڈ!!!
     
    • پسندیدہ پسندیدہ × 1

اس صفحے کی تشہیر