كيفية ضبط الترميز في .getJSON jQuery
-
09-06-2019 - |
سؤال
في تطبيق الويب الخاص بي، أقوم بإرسال بعض حقول النماذج باستخدام jQuery $.getJSON()
طريقة.أواجه بعض المشاكل مع الترميز.مجموعة الأحرف في تطبيقي هي charset=ISO-8859-1
, ، ولكن أعتقد أن هذه الحقول تم إرسالها باستخدام UTF-8
.
كيف يمكنني ضبط الترميز المستخدم في $.getJSON
المكالمات؟
المحلول
أعتقد أنه ربما سيتعين عليك استخدامها $.ajax()
إذا كنت تريد تغيير الترميز، راجع contentType
المعلمة أدناه ( success
و error
تفترض عمليات الاسترجاعات أن لديك <div id="success"></div>
و <div id="error"></div>
في HTML):
$.ajax({
type: "POST",
url: "SomePage.aspx/GetSomeObjects",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: "{id: '" + someId + "'}",
success: function(json) {
$("#success").html("json.length=" + json.length);
itemAddCallback(json);
},
error: function (xhr, textStatus, errorThrown) {
$("#error").html(xhr.responseText);
}
});
في الواقع كان علي أن أفعل هذا منذ حوالي ساعة، يا لها من صدفة!
نصائح أخرى
إذا كنت تريد استخدام $.getJSON()
يمكنك إضافة ما يلي قبل المكالمة:
$.ajaxSetup({
scriptCharset: "utf-8",
contentType: "application/json; charset=utf-8"
});
يمكنك استخدام مجموعة الأحرف التي تريدها بدلاً من ذلك utf-8
.
يتم شرح الخيارات هنا.
contentType :
عند إرسال البيانات إلى الخادم، استخدم هذا content-type
.الافتراضي هو application/x-www-form-urlencoded
, ، وهو أمر جيد بالنسبة لمعظم الحالات.
scriptCharset :
فقط للطلبات مع jsonp
أو script
نوع البيانات ونوع GET.يفرض تفسير الطلب على أنه مجموعة أحرف معينة.مطلوب فقط لاختلافات مجموعة الأحرف بين المحتوى البعيد والمحلي.
ربما تحتاج إلى أحدهما أو كليهما..
تحتاج إلى تحليل استدعاءات JSON باستخدام Wireshark، لذلك سترى ما إذا كنت ستقوم بتضمين مجموعة الأحرف في تكوين صفحة JSON أم لا، على سبيل المثال:
- إذا كانت الصفحة بسيطة إذا نص / html
0000 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d HTTP/1.1 200 OK. 0010 0a 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 74 .Content -Type: t 0020 65 78 74 2f 68 74 6d 6c 0d 0a 43 61 63 68 65 2d ext/html ..Cache- 0030 43 6f 6e 74 72 6f 6c 3a 20 6e 6f 2d 63 61 63 68 Control: no-cach
- إذا كانت الصفحة من النوع الذي يتضمن JSON مخصصًا مع MIME "charset = ISO-8859-1"
0000 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d HTTP/1.1 200 OK. 0010 0a 43 61 63 68 65 2d 43 6f 6e 74 72 6f 6c 3a 20 .Cache-C ontrol: 0020 6e 6f 2d 63 61 63 68 65 0d 0a 43 6f 6e 74 65 6e no-cache ..Conten 0030 74 2d 54 79 70 65 3a 20 74 65 78 74 2f 68 74 6d t-Type: text/htm 0040 6c 3b 20 63 68 61 72 73 65 74 3d 49 53 4f 2d 38 l; chars et=ISO-8 0050 38 35 39 2d 31 0d 0a 43 6f 6e 6e 65 63 74 69 6f 859-1..C onnectio
لماذا هذا؟لأنه لا يمكننا أن نضع على صفحة JSON هدفًا مثل هذا:
في حالتي أستخدم الشركة المصنعة Connect Me 9210 Digi:
- اضطررت إلى استخدام علامة للإشارة إلى أنه سيستخدم MIME غير قياسي:p-> theCgiPtr-> = fDataType eRpDataTypeOther;
- تمت إضافة MIME الجديد في المتغير:strcpy (p-> theCgiPtr-> fOtherMimeType, "text / html;محارف = ISO-8859-1 ");
عملت معي دون الحاجة إلى تحويل البيانات التي تم تمريرها بواسطة JSON لـ UTF-8 ثم إعادة التحويل على الصفحة ...
يستخدم encodeURI()
في العميل JS واستخدامه URLDecoder.decode()
في الجانب خادم جافا يعمل.
مثال:
جافا سكريبت:
$.getJSON( url, { "user": encodeURI(JSON.stringify(user)) }, onSuccess );
جافا:
java.net.URLDecoder.decode(params.user, "UTF-8");
استخدم هذه الوظيفة لاستعادة أحرف utf-8
function decode_utf8(s) {
return decodeURIComponent(escape(s));
}
مثال:
var new_Str=decode_utf8(str);