الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

[سؤال] حول json والترميز utf-8

بدأه أبو محمد اللحياني في 9 مارس 2010 · 1 رد · 872 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

هذا سؤال حِرت فيه كثيراً ، وهو في json و utf8،

الموقع وقاعدة البيانات وجميع الاتصالات بين المتصفح والسيرفر والقاعدة كلها بترميز utf8

استخدم في تحويل المصفوفات في طرف المتصفح الإضافة إلى jQuery

http://code.google.com/p/jquery-json/

واستخدم في تحويل مصفوفة php إلى json مرة أخرى لإرسالها للمتصفح الأمر التالي :

function tojson($a=false) {
    if (is_null($a)) return 'null';
    if ($a === false) return 'false';
    if ($a === true) return 'true';
    if (is_scalar($a)){
      if (is_float($a)){
        // Always use "." for floats.
        return floatval(str_replace(",", ".", strval($a)));
      }

      if (is_string($a)){
        static $jsonReplaces = array(array("\\", "/", "\n", "\t", "\r", "\b", "\f", 

'"'), array('\\\\', '\\/', '\\n', '\\t', '\\r', '\\b', '\\f', '\"'));
        return '"' . str_replace($jsonReplaces[0], $jsonReplaces[1], $a) . '"';
      }
      else return $a;
    }
    $isList = true;
    for ($i = 0, reset($a); $i < count($a); $i++, next($a)) {
      if (key($a) !== $i){ $isList = false; break; }
    }
    $result = array();
    if ($isList){
      foreach ($a as $v) $result[] = tojson($v);
      return '[' . join(',', $result) . ']';
    }
    else{
      foreach ($a as $k => $v) $result[] = tojson($k).':'.tojson($v);
      return '{' . join(',', $result) . '}';
    }
}

ولا أستخدم الدالة json_encode لأنها تحول الترميز العربي المفهوم إلى أحرف unicode ، وهي تزيد في نظري في حجم البيانات .

واستخدم في فك json وتحويلها إلى مصفوفة php الامر التالي :

$pattern = json_decode(stripslashes($pattern), true);

والدالة stripslashes مهمة لأنه لا يصح تفسير نص json إلا بها.

المشكلة:

وكما تعلمون أن json هي عبارة نص يمكن تفسيره إلى مصفوفة، والنصوص في javascritp لا تكون في عدة أسطر إلا بعلامة + .

فإذا اعترض النص أي حرف يدل على سطر جديد فإن jquery-json تحوِّل كل ما يعترض النص إلى أحرف unicode فتحوِّل \n إلا \u000a .

وأحيانا يرسل المتصفح json كل القِيَم بأحرف unicode ثم الامر stripslashes يلغي كل السلاشات / مما يسبب عدم فهم الترميز فيظهر بالشكل التالي : كما في الصورة uEEE.gif و الصورة u000a.gif

السؤال : كيف يمكن تجاوز هذه المشكلة ؟

وجزاكم الله خيراً .

post-71437-12681515601955_thumb.gif

post-71437-1268151576093_thumb.gif

تم تعديل هذه المشاركة بواسطة أبو محمد اللحياني في 9 مارس 2010 في 19:23

ولو وافيت ربك دون ذنب *** وناقشك الحساب إذاً هلكتا

ولم يظلمك في عملٍ ولكن *** عسير أن تقوم بما حملتا

#2

الحمد لله أولاً وآخراً

تم حل المشكلة

وأصل هي استخدام هذا السطر دائماً سواء من البيانات المرسلة من المتصفح أو المأخوذة من قاعدة البيانات

أبو محمد اللحياني كتب:

$pattern = json_decode(stripslashes($pattern), true);

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

وعملنا الدالة التالية لتجاوز المشكلة

function deJSON($data, $ismq=false) {
	if($ismq) return get_magic_quotes_gpc()? json_decode(stripslashes($data), true) : json_decode(data, true);
	return json_decode($data, true);
}

/// use
// form POST
$A = deJSON($_POST['A'], 1);

// from database 
$a = deJSON($row['a']); ///

والله الموفق والحمد لله أولاً وآخراً

ولو وافيت ربك دون ذنب *** وناقشك الحساب إذاً هلكتا

ولم يظلمك في عملٍ ولكن *** عسير أن تقوم بما حملتا

مواضيع مشابهة