سؤال

في تطبيق الويب الخاص بي، أقوم بإرسال بعض حقول النماذج باستخدام 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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top