سؤال

أقوم بإعادة اختراع العجلة وإنشاء أساليب تحليل JSON الخاصة بي في Java.

سأقوم بالوثائق (اللطيفة جدًا!) حول json.org.الجزء الوحيد الذي لست متأكدًا منه هو المكان الذي يقول فيه "أو شخصية التحكم"

نظرًا لأن الوثائق واضحة جدًا، وJSON بسيط جدًا وسهل التنفيذ، اعتقدت أنني سأمضي قدمًا وأطلب المواصفات بدلاً من أن أكون فضفاضًا.

كيف لي أن بشكل صحيح تجريد أحرف التحكم في Java؟ربما هناك نطاق يونيكود؟

enter image description here


يحرر:(عادةً؟) قطعة مفقودة من اللغز

أنا تم إبلاغها أن هناك شخصيات تحكم أخرى خارج النطاق المحدد 1 2 التي يمكن أن تكون مزعجة في <script> العلامات.

أبرزها الأحرف U+2028 وU+2029، وفاصل السطر والفقرة، والتي تعمل بمثابة خطوط جديدة.من المرجح أن يؤدي إدخال سطر جديد في منتصف سلسلة حرفية إلى حدوث خطأ في بناء الجملة (سلسلة حرفية غير منتهية). 3

على الرغم من أنني أعتقد أن هذا لا يشكل تهديدًا XSS، إلا أنه لا يزال من الجيد إضافة قواعد إضافية للاستخدام في <script> العلامات.

  • فقط كن بسيطًا وقم بتشفير جميع الأحرف غير القابلة للطباعة "ASCII" باستخدام \u الرموز.هذه الشخصيات غير شائعة في البداية.إذا أردت، يمكنك الإضافة إلى القائمة البيضاء، لكنني أوصي باتباع نهج القائمة البيضاء.
  • في حالة عدم علمك، لا تنسى عن </script (غير حساس لحالة الأحرف)، والتي يمكن أن يتسبب في إدخال برنامج HTML النصي إلى صفحتك مع الشخصيات </script><script src=http://tinyurl.com/abcdef>.لا يتم ترميز أي من هذه الأحرف افتراضيًا بتنسيق JSON.
هل كانت مفيدة؟

المحلول

سوف حرف.isISOControl(...) يفعل؟بالمناسبة، UTF-16 هو ترميز لنقاط تشفير Unicode...هل ستعمل على مستوى البايت أم على مستوى الحرف/نقطة التشفير؟أوصي بترك التعيين من UTF-16 إلى تدفقات الأحرف إلى واجهات برمجة التطبيقات الأساسية لـ Java...

نصائح أخرى

حتى لو لم يكن الأمر محددًا للغاية، فأنا أفترض أنهم يشيرون إلى فئة الأحرف "التحكم". من مواصفات Unicode.

في Java، يمكنك التحقق مما إذا كان الحرف c هو حرف تحكم Unicode بالتعبير التالي: Character.getType(c) == Character.CONTROL.

أعتقد تعريف Unicode لحرف التحكم يكون:

الأحرف الـ 65 في النطاقين U+0000..U+001F وU+007F..U+009F.

هذا هو تعريفهم لـ أ رمز التحكم, ، ولكن ما سبق يتبعه الجملة "تُعرف أيضًا باسم أحرف التحكم.", ، لذا...

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

Character.isISOControl(int codePoint) 

يقوم بالفحص التالي:

(codePoint >= 0x00 && codePoint <= 0x1F) || (codePoint >= 0x7F && codePoint <= 0x9F);

تحدد مواصفات JSON في https://tools.ietf.org/html/rfc7159:

  1. سلاسل

    يشبه تمثيل السلاسل الاتفاقيات المستخدمة في عائلة C من لغات البرمجة.تبدأ السلسلة وتنتهي بعلامات اقتباس.قد يتم وضع جميع أحرف Unicode ضمن علامات الاقتباس ، باستثناء الشخصيات التي يجب الهروب منها:علامة الاقتباس، Solidus العكسي، و أحرف التحكم (U+0000 من خلال U+001F).

Character.isISOControl(int codePoint) 

سيتم وضع علامة على جميع الشخصيات التي تحتاج إلى الهروب (U+0000-U+001F), ، على الرغم من أنه سيحدد أيضًا الأحرف التي لا تحتاج إلى الهروب (U+007F-U+009F).ليس من الضروري الهروب من الشخصيات (U+007F-U+009F).

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