هل من الممكن تعيين مجموعة أحرف القبول لكائن FormData (XHR2) الجديد أو الحل البديل

StackOverflow https://stackoverflow.com//questions/22046930

سؤال

هنا رمز المثال (http://jsfiddle.net/epsSZ/1/):

لغة البرمجة:

<form enctype="multipart/form-data" action="/echo/html" method="post" name="fileinfo" accept-charset="windows-1251">
  <label>Label:</label>
  <input type="text" name="label" size="12" maxlength="32" value="får løbende" /><br />
  <input type="submit" value="Send standart">
</form>
<button onclick="sendForm()">Send ajax!</button>

شبيبة:

window.sendForm = function() {
  var oOutput = document.getElementById("output"),
     oData = new FormData(document.forms.namedItem("fileinfo"));
  var oReq = new XMLHttpRequest();
  oReq.open("POST", "/echo/html", true);
  oReq.send(oData);
}

عندما أقوم بالإرسال بهذه الطريقة القديمة عبر إرسال النموذج القياسي، تبدو حمولة الطلب كما يلي:

------WebKitFormBoundary2890GbzEKCmB08rz
Content-Disposition: form-data; name="label"

f&#229;r l&#248;bende

ولكن عندما أرسل طريقة AJAX هذه، يبدو الأمر مختلفًا بعض الشيء:

------WebKitFormBoundaryPO2mPRFKj3zsKVM5
Content-Disposition: form-data; name="label"

får løbende

كما ترون ، في الحالة السابقة ، يتم استبدال بعض chars بكيانات شخصية ، ولكن في حالة الاستخدام FormData هناك سلسلة بسيطة، وهو أمر جيد بالطبع لأنه utf-8، ولكن هل هناك أي إمكانية لجعله يتصرف مثل إرسال النموذج القياسي؟

هل كانت مفيدة؟

المحلول

الجواب على سؤالك هو لا.لا يمكنك تغيير ذلك.وفقا XMLHttpRequest2 TR, FormData شيدت البيانات صراحة ترميز UTF-8.مع عدم ذكر يسمح لتغيير ذلك.

المعتاد نوعه أو نوع المحتوى=charset تصبح غير صالحة متعددة جزء من الطلبات ، حيث يتم التعامل معها بشكل مختلف لنفس السبب.

إلى الاقتباس ،

إذا كانت البيانات هو FormData والسماح طلب الكيان يكون نتيجة تشغيل multipart/form-data خوارزمية ترميز البيانات كما شكل مجموعة البيانات مع UTF-8 كما واضح ترميز الأحرف.

اسمحوا نوع mime تكون سلسلة من "multipart/form-data;", U+0020 الفضاء حرف "الحدود=" ، multipart/form-data الحدود السلسلة التي تم إنشاؤها بواسطة multipart/form-data خوارزمية ترميز.

ويساعد هذا الأمل!

التحديث

إذا كنت على استعداد للتخلي عن

new FormData(document.forms.namedItem("fileinfo"));

بالنسبة

new FormData().append("name", "value")

قد يكون هناك حل عملي ممكن.اسمحوا لي أن أعرف إذا كان هذا ما كنت أبحث عنه.

آخر تحديث

فعلت قليلا من يركض. تحديث كمان مع جميع وسائط

لذلك هذا هو القصة ،

1 form with accept-charset="utf8" => السلوك الافتراضي

المحتوى لا يتطلب أي إضافية الهروب/الترميز.لذلك طلب الحرائق مع النص سليما كما får løbende

2 form with accept-charset="windows-1251" => قضيتك

المحتوى يتطلب مزيدا من الهروب/ترميز منذ default charset من المتصفح هنا هو utf8.وبالتالي فإن المحتوى هو هرب, ثم أطلق ، أيالمحتوى أرسل هو f&#229;r l&#248;bende

3 FormData constructed with form element

المحتوى لا يتطلب أي إضافية الهروب/الترميز ، لأنه تخلف عن utf8.لذلك طلب الحرائق مع النص får løbende.

4 FormData constructed, and then appended with escaped data

المحتوى لا يزال في ترميز utf8, ولكن ذلك لا يضر الاتصال escape(content) قبل إلحاق إلى نموذج البيانات.هذا يعني طلب الحرائق مع النص f%E5r%20l%F8bende.لا يوجد الزهر صحيح ؟

لقد كنت مخطئا, لا.أبحث عن أقرب[read => يحدق لبضع دقائق....] في

f&#229;r l&#248;bende و

f%E5r%20l%F8bende

ثم سقط كل شيء في مكانه - %E5 (سداسي عشري) = &#229; (عشري).وذلك أساسا escape()هو جافا سكريبت بعض ، % على أساس الترميز ، وهي ليست HTML ودية.

وبالمثل &#;, كما نعرف هو HTML طريقة الترميز.لذلك أنا وضعت آخر وضع اياكس, [وهو ما كنت أبحث عنه, وأنا على التخمين]

5 FormData constructed, and then appended with html-escaped data

المحتوى لا يزال في ترميز utf8.لا يضر أن الهروب مثل HTML ترميز باستخدام هذه القطعة الرائعة من التعليمات البرمجية من ستاكوفيرفلوو.وفويلا ، طلب النار مع النص f&#229;r l&#248;bende

تحديث كمان مع جميع وسائط

آمل أن يساعد هذا واضح من ذلك!

تحديث لنظام التشغيل windows-1251 الدعم الكامل

هذا привет får løbende المدخلات كانت فاشلة في وقت سابق وضع 5.تحديث كمان http://jsfiddle.net/epsSZ/6/.

يستخدم مزيج من حل هنا https://stackoverflow.com/a/2711936/1304559 و الألغام.وبالتالي فإن المشكلة هي الهروب من كل شيء.حتى الآن الهروب فقط أحرف غير موجودة في ويندوز-1251 محارف.

هذا يساعد وآمل!

نصائح أخرى

شكرا لك على هذا السؤال، لقد استمتعت بنفسي!:)
يستبدل

<form enctype="multipart/form-data" action="/echo/html" method="post" name="fileinfo" accept-charset="windows-1251">

بواسطة

<form enctype="multipart/form-data" action="/echo/html" method="post" name="fileinfo" accept-charset="utf-8">

المشكلة هي قبول الأحرف windows-1251 بدلاً من utf-8

بعد

oReq.open("POST", "/echo/html", true);

يمكنك أيضًا إضافة

oReq.overrideMimeType('text/html; charset=UTF-8');
oReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

ولكن هذا ليس ما يحل المشكلة.

حظ سعيد.:)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top