النتائج 1 إلى 2 من 2

الموضوع: الـ UTF8 - الكيف والمشاكل والحلول.. (أرشيف)

  1. #1
    عضو نشيط
    تاريخ التسجيل
    Aug 2007
    المشاركات
    73

    الـ UTF8 - الكيف والمشاكل والحلول.. (أرشيف)



    بسم الله الرحمن الرحيم

    نظراً لأني بصدد برمجة مشروع خاص.. أحببت أن يكون متوافق مع جميع المعايير القياسية وأن يكون متطور مع النظرة الحديثة للويب2، فكان أول شيء علي أن أراعيه هو الترميز.. ونظرا لأن ترميز الـ UTF8 هو من التراميز العالمية ولكثرة إيجابياته ومحاسنة التي تطغى عن سلبياته إن وجدت، أردت أن أعتمد هذا الترميز.. ونظرا لقلة معرفتي عنه كالكثير من قرّاء هذا الموضوع حالياً.. وددت أن أشارك ماتوصلت إليه من بحث في مواضيع سوالف معكم.. وأخفف عنكم عناء ماعانيته من بحث وقراءة للكثير من الموضيع التي غالباً ما لن توصلكم إلى ماتريدونه..


    بعد البحث والقراءة أذكر لكم أهم المواضيع التي ذكرت عن هذا الترميز:

    1) إنشاء قاعدة بيانات بترميز utf8_unicode_ci وليس utf8_general_ci
    راجع http://www.swalif.net/softs/swalif-1557111-6.html

    2) أثناء إضافة البيانات لقاعدة البيانات تأكد من إضافتها بترميز الـ utf8 وليس باللغة العربية
    راجع http://www.swalif.net/softs/swalif-1557372-10.html
    للتوضيح أنظر النقطه 6

    3) ان يكون هيدر الموقع يصاحبه تعريف بأن الصفحه تحوي نص utf8
    راجع http://www.swalif.net/softs/swalif-1515207-2.html

    4) كيف نجلب نص من قاعدة البيانات بصيغة utf8
    راجع http://www.swalif.net/softs/swalif-1515207-2.html

    5) لتعديل قاعدة البيانات .. إلى ترميز utf8
    راجع http://www.swalif.net/softs/swalif-1515207-2.html

    6) تحويل النصوص (مدخلات - مخرجات) من ترميز الى اخر او تحويل كامل الموقع
    للنصوص او كامل الموقع راجع http://www.swalif.net/softs/swalif-1031627-1.html
    راجع أيضاً Khaled Al-Shamaa PHP & Arabic Language
    لقواعد البيانات راجع http://www.swalif.net/softs/swalif-1432998-1.html

    7) إن واجهتك مشكله في هذا الترميز وبسبب الدوال التي لا تقبل اي شيء قبلها
    مثل الـ sessions او الـ headers فيكون السبب غالباً في الـ BOM
    راجع http://www.swalif.net/softs/swalif-1570436-1.html

    8) لجلب نصوص ذات ترميز مخالف لترميز موقعك (الـ utf8)
    راجع http://www.swalif.net/softs/swalif45/softs197513/

    9) لتحويل قواعد البيانات الجاهزة إلى ترميز الـ utf8
    عن طريق التحميل وإعادة الرفع راجع http://www.swalif.net/softs/swalif-1429282-1.html
    عن طريق الشيل راجع http://www.swalif.net/softs/swalif-1429440-5.html
    عن طريق سكربت راجع http://www.swalif.net/softs/swalif54/softs197813/

    10) عند كتابة ملف بالترميز utf-8 وادراج كلمات عربية لاتظهر بالشكل المطلوب
    راجع http://www.swalif.net/softs/swalif-1407257-4.html

    مواضيع ذات صلة:
    http://www.swalif.net/softs/swalif54/softs200057/



    أرجو أن تكونو استفدتم :nice:
    دعواتكم وشكرا





    __________________
    مملكة الموت
    =======================
    100(سبحان الله وبحمده ،،، سبحان الله العظيم) = 0 سيئة


  2. #2
    عضو نشيط
    تاريخ التسجيل
    Aug 2007
    المشاركات
    73


    إخواني الأعزاء.. بعد القراءة قمت بتطبيق مثال لكم عبارة عن سكربت بسيط لعرض وإضافة الأخبار
    ستجد السكربت بالمرفقات.. بعد التحميل وفك الضغط عنه ستجد مجلد اسمه dsUTF8 وبداخله ستجد ملفين. الأول index.php وهو الذي سنقم بشرحه، أما الثاني وهو SQL.txt وبه محتوى الجدول الذي يتعين عليك زراعته..

    لنقم بشرح التركيب:
    1) قم بإضافة قاعدة جديده وليكن اسمها test_utf8 أو قم بتغيير الاسم الموجود بالسطر 9 في ملف الـ index.php حسب رغبتك.
    ملحوظه: - لا يهم ترميز القاعده

    2) قم بزراعة مابداخل ملف الـ SQL.txt في قاعدة البيانات التي سبق لك وأنشأتها.

    3) قم باستدعاء ملف الـ index.php من المتصفح بعد وضعه في مجلد العرض في السيرفر الشخصي.



    الآن وبعد أن قمنا بالتركيب لنقم بالتجربة البرنامج بإدخال وعرض.

    .
    .
    .
    .
    .
    .
    .

    هل كان يعمل بشكل جيد؟ ممتاز..
    لنلقي نظرة الآن عن مصدر ملف الـ index.php

    كود PHP:
    <?php
    //---------------------------------------
    // THIS EXAMPLE HAS BEEN DONE BY DSQ8.COM
    //---------------------------------------
    // للاتصال بالخادم وقاعدة البيانات 
    $dsConnect mysql_connect('localhost''root'''); 
    if(
    is_string($dsConnect)){ die('لم استطع الاتصال بالخادم'); }
    $dsTable mysql_select_db('test_utf8'$dsConnect);
    if(!
    $dsTable){ die('لم استطع العثور على قاعدة البيانات'); }
    if (
    $_GET['act']=='view') {
     
    $dsOutput "<div>\n";
     
    $result mysql_query("SELECT * FROM news ORDER BY id DESC");
     while(
    $row mysql_fetch_array($result)) {
      
    $headline trim(nl2br(stripslashes($row[headline])));
      
    $contents trim(nl2br(stripslashes($row[contents])));
      
    $dsOutput .= "<div class=\"block\"><h1>#$row[id] - $headline</h1><h2>$contents</h2><br /></div>\n";
     }
     
    $dsOutput .= "</div>\n";
    } elseif (
    $_REQUEST['act']=='add') {
     if (!
    $_POST['save']) {
      
    $dsOutput '<form action="?act=add" method="post"><ul>
     <li class="txt">العنوان: </li>
     <li><input type"text" name="headline" /></li>
     <li class="txt">الخبر: </li>
     <li><textarea name="contents"></textarea></li>
     <li class="txt">العمل: </li>
     <li><input class="btn" type="submit" name="save" value="إحفظ" />
     <input class="btn" type="reset" value="تفريغ" /></li>
     </ul></form>'
    ;
      
    $dsOutput iconv("","UTF-8",$dsOutput);
     } else {
      if (empty(
    $_POST['headline'])||empty($_POST['contents'])) {
       
    $dsOutput 'لم تقم بتعبئة جميع البيانات';
       
    $dsOutput iconv("","UTF-8",$dsOutput);
      } else {
       
    $headline addslashes($_POST['headline']);
       
    $contents addslashes($_POST['contents']);
       
    $dsInsert mysql_query("insert into news (headline,contents) values ('$headline','$contents')");
       
    $dsOutput = ($dsInsert) ? 'تم بحمد الله حفظ البيانات<br />لعرض البيانات <a href="?act=view">إضغط هنا</a>' 'حدثت مشكلة، فلم يتم حفظ البيانات' ;
       
    $dsOutput iconv("","UTF-8",$dsOutput);
      }
     }
    } else {
     
    $dsOutput '<span><a href="?act=add">إضافة</a><a href="?act=view">عرض</a></span>';
     
    $dsOutput iconv("","UTF-8",$dsOutput);
    }
    $dsLinks '[ <a href="?act=add">إضافة خبر</a> ] - [ <a href="?act=view">عرض الأخبار</a> ]';
    $dsLinks iconv("","UTF-8",$dsLinks);
    ?>
    <html dir="rtl">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <style>
    body { font-family:Tahoma; font-size:9px; color:#000; margin:0px; padding:5px; background:#fff; }
    a { color:#bbb; font-size:11px; text-decoration:none; }
    a:hover { color:#333; }
    span { width:163px; }
    span a { background:#eee; padding:20px; float:right; margin:2px; border:1px solid #999; color:#555; font-size:16px; text-decoration:none; }
    span a:hover { background:#555; color:#eee; text-decoration:underline; }
    form { margin:0px; padding:0px; width:500px; }
    form ul { margin:0px; padding:3px; list-style:none; font-size:12px; }
    form li { margin:2px; width:100%; padding:0px; text-align:right; }
    form li.txt { background:#f9f9f9; float:right; padding:5px; margin:0px 0px 0px 0px; width:100px; color:#666; }
    form li input { border:1px solid #ddd; margin:0px 2px 0px 0px; padding:3px; width:381px; font-family:Tahoma; color:#777; }
    form li textarea { width:381px; height:50px; border:1px solid #ddd; margin:0px 2px 0px 0px; padding:3px; font-family:Tahoma; font-size:12px; color:#777; }
    form li input.btn { width:100px; border:1px solid #ddd; margin:0px 2px 0px 0px; background:#f5f5f5; }
    div { padding:0px; margin:0px; width:720px; display:block; }
    div.block { width:350px; padding:5px; text-align:justify; margin:5px 0px 5px 0px; border-bottom:2px dashed #f0f0f0; float:right; }
    div.block h1 { font-family:Tahoma; font-size:12px; font-weight:bold; margin:0px; padding:5px 15px 5px 5px; background:#f8f8f8; border-bottom:1px solid #bbb; color:#666; }
    div.block h2 { font-family:Tahoma; font-size:11px; font-weight:normal; margin:0px; padding:5px; color:#999; }
    div.dsq8 { line-height:100px; float:left; }
    </style>
    </head>
    <body>
    <?php echo "$dsLinks\n"?>
    <center>
    <?php echo "$dsOutput\n".iconv('','UTF-8','<div class="dsq8">اعداد وتقديم: <a href="http://dsq8.com/" title="DeaD SouL" target="_blank">DSQ8.com</a> - فلا تبخل بالدعاء لي ولأهلي إن استفدت</div>'); ?>
    </center>
    </body>
    </html>
    معقد؟؟ بالعكس سهل جدا..
    لنقم بشرح أهم محتوياته

    كود PHP:
    $dsConnect mysql_connect('localhost''root'''); 
    if(
    is_string($dsConnect)){ die('لم استطع الاتصال بالخادم'); }
    $dsTable mysql_select_db('test_utf8'$dsConnect);
    if(!
    $dsTable){ die('لم استطع العثور على قاعدة البيانات'); } 
    يقوم هذا الكود بالاتصال بقاعدة البيانات
    ان كان اسم القاعدة غير ال test_utf8 علينا التعديل في الكود السابق لتعديل اسم القاعدة


    كود PHP:
    if ($_GET['act']=='view') {
     
    $dsOutput "<div>\n";
     
    $result mysql_query("SELECT * FROM news ORDER BY id DESC");
     while(
    $row mysql_fetch_array($result)) {
      
    $headline trim(nl2br(stripslashes($row[headline])));
      
    $contents trim(nl2br(stripslashes($row[contents])));
      
    $dsOutput .= "<div class=\"block\"><h1>#$row[id] - $headline</h1><h2>$contents</h2><br /></div>\n";
     }
     
    $dsOutput .= "</div>\n";

    عمل هذا الكود هو: إن كانت الصفحه المطلوبة هي صفحة العرض. فقم بعمل استعلام لقاعدة البيانات تستعلم عن محتويات جدول الأخبار وقم تخزين المحتويات في متغير اسمه $dsOutput
    لأننا لسنا بصدد أوامر الاتصال والاستعلام فلن أخوض بها بكثرة.



    كود PHP:
    elseif ($_REQUEST['act']=='add') { 
    إن كانت الصفحة المطلوبة هي صفحة إدخال الأخبار قم بالتالي



    كود PHP:
    if (!$_POST['save']) {
      
    $dsOutput '<form action="?act=add" method="post"><ul>
     <li class="txt">العنوان: </li>
     <li><input type"text" name="headline" /></li>
     <li class="txt">الخبر: </li>
     <li><textarea name="contents"></textarea></li>
     <li class="txt">العمل: </li>
     <li><input class="btn" type="submit" name="save" value="إحفظ" />
     <input class="btn" type="reset" value="تفريغ" /></li>
     </ul></form>'
    ;
      
    $dsOutput iconv("","UTF-8",$dsOutput);
     } 
    إن كانت لم يوجد المتغير "save" فقم بعرض نموذج لإدخال الخبر
    ومايهمنا هنا هو هذا السطر
    كود PHP:
    $dsOutput iconv("","UTF-8",$dsOutput); 
    فلقد قلنا للبرنامج أن يقم بتحويل النص الذي قمنا بكتابته إلى نص ذا ترميز الـ utf-8
    على العكس ما قمنا به في السابق.. حيث أننا لم نقم بتحويل ترميز البيانات التي قمنا بجلبها في صفحة عرض الأخبار وسنعرف السبب لاحقاً



    كود PHP:
    else { 
    في حال ما إذا بالفعل وجدت قيمة المتغير "save" قم بالتالي



    كود PHP:
    if (empty($_POST['headline'])||empty($_POST['contents'])) {
       
    $dsOutput 'لم تقم بتعبئة جميع البيانات';
       
    $dsOutput iconv("","UTF-8",$dsOutput);
      } 
    إن كانت أحد هذي القيم فارغة أو ليست موجوده فقم بتخزين "لم تقم بتعبئة جميع البيانات" في متغير الـ $dsOutput ومن ثم حول ترميز محتوى هذا المتغير إلى ترميز الـ utf-8
    التحويل تم عن طريق الدالة
    كود PHP:
       $dsOutput iconv("","UTF-8",$dsOutput); 



    كود PHP:
    else {
       
    $headline addslashes($_POST['headline']);
       
    $contents addslashes($_POST['contents']);
       
    $dsInsert mysql_query("insert into news (headline,contents) values ('$headline','$contents')");
       
    $dsOutput = ($dsInsert) ? 'تم بحمد الله حفظ البيانات<br />لعرض البيانات <a href="?act=view">إضغط هنا</a>' 'حدثت مشكلة، فلم يتم حفظ البيانات' ;
       
    $dsOutput iconv("","UTF-8",$dsOutput);
      }
     } 
    في حال ما إذا كانا المتغيران السابقان يحتوان على قيم معينة قم بإضافة السلاش لهما وبعدها قم بإضافتهما إلى جدول الـ news
    وبعد الإضافة تحقق إن تمت الإضافة بالفعل أم لم تتحقق وفي كلا الحالتين قم بتخزين نتيجة التحقق في متغير الـ $dsOutput..... ونكرر عملية التحويل عن طريق الدالة
    كود PHP:
       $dsOutput iconv("","UTF-8",$dsOutput); 


    كود PHP:
    } else {
     
    $dsOutput '<span><a href="?act=add">إضافة</a><a href="?act=view">عرض</a></span>';
     
    $dsOutput iconv("","UTF-8",$dsOutput);

    إن لم تكن الصفحه المطلوبة لا صفحة الإضافة ولا صفحة العرض.. قم بسؤال الزائر عما إذا كان يريد الإضافة أو العرض....... ونكرر عملية التحويل




    كود PHP:
    $dsLinks '[ <a href="?act=add">إضافة خبر</a> ] - [ <a href="?act=view">عرض الأخبار</a> ]';
    $dsLinks iconv("","UTF-8",$dsLinks); 
    عملنا متغير يحتوي على رابط الإضافة ورابط العرض وبعدها قمنا بالتحويل





    كود HTML:
    <html dir="rtl">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <style>
    body { font-family:Tahoma; font-size:9px; color:#000; margin:0px; padding:5px; background:#fff; }
    a { color:#bbb; font-size:11px; text-decoration:none; }
    a:hover { color:#333; }
    span { width:163px; }
    span a { background:#eee; padding:20px; float:right; margin:2px; border:1px solid #999; color:#555; font-size:16px; text-decoration:none; }
    span a:hover { background:#555; color:#eee; text-decoration:underline; }
    form { margin:0px; padding:0px; width:500px; }
    form ul { margin:0px; padding:3px; list-style:none; font-size:12px; }
    form li { margin:2px; width:100%; padding:0px; text-align:right; }
    form li.txt { background:#f9f9f9; float:right; padding:5px; margin:0px 0px 0px 0px; width:100px; color:#666; }
    form li input { border:1px solid #ddd; margin:0px 2px 0px 0px; padding:3px; width:381px; font-family:Tahoma; color:#777; }
    form li textarea { width:381px; height:50px; border:1px solid #ddd; margin:0px 2px 0px 0px; padding:3px; font-family:Tahoma; font-size:12px; color:#777; }
    form li input.btn { width:100px; border:1px solid #ddd; margin:0px 2px 0px 0px; background:#f5f5f5; }
    div { padding:0px; margin:0px; width:720px; display:block; }
    div.block { width:350px; padding:5px; text-align:justify; margin:5px 0px 5px 0px; border-bottom:2px dashed #f0f0f0; float:right; }
    div.block h1 { font-family:Tahoma; font-size:12px; font-weight:bold; margin:0px; padding:5px 15px 5px 5px; background:#f8f8f8; border-bottom:1px solid #bbb; color:#666; }
    div.block h2 { font-family:Tahoma; font-size:11px; font-weight:normal; margin:0px; padding:5px; color:#999; }
    div.dsq8 { line-height:100px; float:left; }
    </style>
    </head>
    <body>
    <?php echo "$dsLinks\n"; ?>
    <center>
    <?php echo "$dsOutput\n".iconv('','UTF-8','<div class="dsq8">اعداد وتقديم: <a href="http://dsq8.com/" title="DeaD SouL" target="_blank">DSQ8.com</a> - فلا تبخل بالدعاء لي ولأهلي إن استفدت</div>'); ?>
    </center>
    </body>
    </html>
    هذا كود هتمل عادي يحتوي على أوامر php لعرض المتغيرات التي سبق لنا وأن صنعناها
    وأهم ما يحتويه هو السطر التالي
    كود HTML:
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    الذي أخبرنا فيه أن بيانات هذه الصفحه هي بترميز الـ utf-8


    محتويات ملف الـ SQL.txt
    كود PHP:
    CREATE TABLE `news` (
      `
    idint(11unsigned NOT NULL auto_increment,
      `
    headlinevarchar(255collate utf8_unicode_ci NOT NULL,
      `
    contentstext collate utf8_unicode_ci,
      
    PRIMARY KEY  (`id`),
      
    KEY `headline` (`headline`)
    ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=
    أهم ما يهمنا فيه هو
    كود PHP:
    collate utf8_unicode_ci 
    ففي هذا السطر سنقوم بتعريف ترميز هذا الحقل على أساس أنه حقل يحمل ترميز الـ UTF8


    ترا لماذا لم نقم بتحويل البيانات التي جلبناها في صفحة عرض الأخبار إلى ترميز الـ utf-8 ???

    الإجابة سهله جدا... لأننا سبق لنا وأن قمنا بتحويلها إلى هذا الترميز عند الإضافة...
    صحيح أننا لم نقم بذلك عملياً.. ولكن بم أن صفحة نموذج إرسال الخبر كانت بترميز utf8 فكان هذا كافيا لجعل القيم المرسله من تلك الصفحه بترميز الـ utf8
    لذلك فإن قمنا ترميز البيانات المستخرجه من قاعدة البيانات فكأننا نقوم بإعادة ترميز الترميز.. وهذا سيسبب عرض الطلاسم والرموز المبهمه


    ترا لماذا ذكرت أن ترميز قاعدة البيانات لا يهم ؟؟؟

    الإجابة سهله أيضاً لأن ليس مايهمنا هو ترميز قاعدة البيانات على قدر مايهمنا جدول الأخبار الذي سنقوم بالتعامل معه.. وهذا معناته أنه من الممكن أن يكون ترميز القاعدة مخالف لترميز الجدول..
    ليس هذا فحسب بل من الممكن أيضاً أن يحتوي جدول واحد على حقول ذات تراميز مختلفه..


    الاستنتاجات الشخصيه:

    1) يجب أن لا ننسى وسم الميتا في صفحة الhtml ذات ترميز utf8
    2) ليس من المهم أن تكون القاعدة بترميز الـ utf8 أو أن تكون جميع حقول الجداول بهذا الترميز.. لأنه من الجائز أن يكون هناك حقول بترميز مخالف لترميز الـ utf8 بجانب حقول أخرى تحمل هذا الترميز في الجدول الواحد..
    3) علينا أن لا ننسى أنه إن كنا بصدد جلب بيانات معينة من حقل ليس لا يحمل ترميز الـ utf8 فإنه يتعين علينا أن نقوم بتحويل هذه البيانات إلى ترميز ال utf8 مع عدم تحويل تلك البيانات الأخرى (لأنها في الواقع تحمل هذا الترميز)
    4) أن الجدول واحد قد يعمل بشكل سليم دون أية مشاكل إن كان يحتوي على أكثر من ترميز للحقول.. طالما استطعنا معرفة من يحتاج لتحويل الترميز ومن لا يحتاج



    هذه الإستنتاجات شخصيه قد تحتمل الإصابة والخطأ، ولكنها مدعومه بدلائل التجربه..


    في النهاية إن أصبت فمن الله وإن أخطأت فمني ومن الشيطان..

    دعواتكم دعواتكم





    الملفات المرفقة الملفات المرفقة
    __________________
    مملكة الموت
    =======================
    100(سبحان الله وبحمده ،،، سبحان الله العظيم) = 0 سيئة





ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •  

أضف موقعك هنا| اخبار السيارات | حراج | شقق للايجار في الكويت | بيوت للبيع في الكويت | دليل الكويت العقاري | مقروء | شركة كشف تسربات المياه | شركة عزل اسطح بالرياض | عزل فوم بالرياض| عزل اسطح بالرياض | كشف تسربات المياة بالرياض | شركة عزل اسطح بالرياض