سؤال

لدي مشكلة لا أعرف كيف أحلها.

لدي خادم HTTP INDY10. لقد استخدمت كل من خوادم Indy9 و Indy10 HTTP في العديد من التطبيقات ولم أواجه أي مشاكل. لكنني الآن أستخدم خادم HTTP INDY10 مع إطار عمل extJS JavaScript RAI.

المشكلة هي عندما أقوم بإرسال البيانات التي تحتوي على أحرف غير ANDI. على سبيل المثال ، عندما أقوم بإرسال رسالة "č" وهي رسالة في 1250 Codepage (السلوفينية ، الكرواتية ...) أحصل على ما يلي في Indy تحت "params undarsed" -> "٪ C4 ٪ 8D". هذا هو التمثيل السداسي السداسي الصحيح للحرف "č" في ترميز UTF-8. جميع صفحاتي هي UTF-8 ولم أواجه أي مشاكل في تقديم بيانات النموذج إلى Indy. لقد قمت بتصحيح الرمز ورأيت أنني أحصل بالفعل على سلسلة من البايتات مثل هذا: [37 ، 67 ، 52 ، 37 ، 56 ، 68]. هذا هو تمثيل البايت للسلسلة "٪ C4 ٪ 8D". لكن بالطبع لا يمكن أن تقوم Indy بتشفير هذا بشكل صحيح إلى UTF-16. لذلك كمثال. حقل النموذج الفعلي:

FirstName=črt

يخرج هكذا عند الإقامة:

FirstName=%C4%8Drt

لا أعرف كيف أحل هذا. نظرت إلى منتديات ExtJS ، لكن لا يوجد شيء في هذا الموضوع. أي شخص يعرف أي شيء عن هذا النوع من المشكلة؟

تعديل:

إذا قمت بتشفير params ad json فإنها تصل بشكل صحيح. حاولت أيضًا فك تشفير URL للمعلمات ، لكن النتيجة غير صحيحة. ربما فاتني شيء. سوف أنظر إلى هذا مرة أخرى. ونعم يبدو أن عنوان URL ExtJS يشفر المعاملات

EDIT2:

حسنًا ، لقد اكتشفت المزيد. قارنت المحتوى الفعلي لبيانات النشر. هو مثل هذا:

Delphi 2006 (Indy10): FirstName=%C4%8D
Delphi 2010 (Indy10): FirstName=%C4%8D

في كلتا الحالتين ، تكون البراميل غير المتطابقة متطابقة. لقد تم تشغيل parseparams وفي BDS2006 يتم تحليلها بشكل صحيح ، لكن في عام 2010 ، لم تكن كذلك. هذا هو Indy10 بكميات كبيرة مع Delphi. هل هناك خطأ في هذا الإصدار أم أفعل شيئًا خاطئًا؟

EDIT3:

لقد قمت بتنزيل أحدث Build Nightly OD INDY10. لا يزال نفس القضية.

EDIT4:

أنا مجبر على قبول إجابتي الخاصة.

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

المحلول

للإجابة على هذا الموضوع.

هذا بالتأكيد لا يعمل كما ينبغي تحت يونيكود. يستخدم Indy سلاسل Unicode داخليًا. المشكلة هي عندما يتم فك تشفير المعلمات إلى قائمة tstringlist. المشكلة هي الخط:

Params.Add(TIdURI.URLDecode(s));

وجدت في "tidhttprequestinfo.decodeansetparams". لا فك تشفير المعلمات بشكل صحيح ، ربما لأنه يعمل على سلاسل Unicode.

الحل الذي وجدته هو استخدام "httpdecode" من "httpapp.pas".

Params := TStringList.Create;
try
  Params.StrictDelimiter := True;
  Params.Delimiter := '&';

  // parse the parameters and store them into temporary string list
  Params.DelimitedText := UTF8ToString(HTTPDecode(UTF8String(Request.UnparsedParams)));
  // do something with params... 
finally
  Params.Free;
end;

لكنني لا أستطيع أن أصدق أن هذه المهمة المشتركة لا تعمل بشكل صحيح. هل يمكن لأحد أن يؤكد أن هذا خطأ حقًا أم أنني أفعل شيئًا خاطئًا؟

نصائح أخرى

يبدو أن السلسلة مشفرة عن عنوان URL ، بحيث تستخدم الكود التالي لفك تشفيره:

uses
  idURI;

value := TIdURI.URLDecode( value );

تعديل

يبدو أن هناك حالة لا يتم فيها فك تشفير الترميز بشكل صحيح عن بايت مزدوج كحرف واحد. بالنظر إلى المصدر ، يبدو أنه من شأنه فك التشفير بشكل صحيح إذا تم ترميز الحرف مثل ٪ UC48D ولكن في اختباري لا يزال هذا لا يفكك بشكل صحيح. الأمر المثير للاهتمام هو أن وظيفة tiduri.paramsencode تولد الترميز المناسب ، ولكن هذا الترميز لا يمكن عكسه باستخدام الروتين المناسبة في أحدث إصدار من Indy 10.

أنا أستخدم Delphi 7 وترحيل إلى Indy 10. لقد وجدت مشكلة محتملة مع الأحرف البرتغالية وحل هذا تغيير المصدر أدناه:

procedure TIdHTTPRequestInfo.DecodeAndSetParams(const AValue: String);
  ...
  //Params.Add(TIdURI.URLDecode(s)); //-- UTF8 supose
  Params.Add(TIdURI.URLDecode(s,TIdTextEncoding.Default)); //-- ASCII worked
  ...

نهاية؛

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