السلام عليكم ورحمة الله وبركاته
هذا سؤال حِرت فيه كثيراً ، وهو في 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
السؤال : كيف يمكن تجاوز هذه المشكلة ؟
وجزاكم الله خيراً .