2013-01-06 10 views
17

ठीक है, मैं एक सार्वजनिक JSONP API चला रहा हूं जो डेटा को मेरे PHP सर्वर से परोसा जाता है। मैं सिर्फ यह लेख पढ़ें:PHP में यू + 2028 या यू + 2029 वर्णों को प्रतिस्थापित करने/सहेजने के लिए कैसे करें मेरे JSONP API को तोड़ने के लिए

असल में अगर मेरी JSON तार एक U + 2028 चरित्र (यूनिकोड लाइन विभाजक) या U + 2029 वर्ण है (यूनिकोड अनुच्छेद विभाजक) तो यह पूरी तरह से वैध JSON है। हालांकि JSONP का उपयोग करते समय JSON को जावास्क्रिप्ट के रूप में निष्पादित किया जाता है और जावास्क्रिप्ट में कोई स्ट्रिंग में शाब्दिक U + 2028 या U + 2029 हो सकता है क्योंकि यह जावास्क्रिप्ट को तोड़ देगा। स्पष्ट रूप से यह आमतौर पर तब तक कोई समस्या नहीं है जब तक आप एक उचित JSON पार्सर का उपयोग नहीं करते हैं, लेकिन JSONP के मामले में ब्राउज़र JSON पार्सर है।

अनिवार्य रूप से यदि ये वर्ण क्लाइंट को भेजे जाने वाले मेरे JSONP डेटा में तारों के अंदर थे तो यह स्ट्रिंग में एक रेखा या पैराग्राफ ब्रेक फेंक देगा जो जावास्क्रिप्ट को तोड़ देगा और इसे निष्पादित करना बंद कर देगा। यह एक संभावना है क्योंकि एपीआई कुछ क्लाइंट दर्ज डेटा वापस भेज रहा है। कोई संभावित रूप से डेटाबेस में U + 2028 या U + 2029 दर्ज कर सकता है, इसलिए जब मैं इसे वापस जेएसओएनपी के रूप में भेजता हूं तो यह मेरे एपीआई का उपयोग करके किसी भी कार्यान्वयन को तोड़ देगा।

तो मेरा सवाल है, PHP में मैं इसे भेजने के पहले यू + 2028 और यू + 2029 वर्णों को हटाने या निकालने के लिए JSON डेटा से कैसे बच/आउटपुट कर सकता हूं?

वर्तमान में मेरी प्रक्रिया डेटा की एक सरणी पर json_encode कर रही है और उस डेटा को क्लाइंट को भेज रही है। क्या मुझे सरणी के माध्यम से लूप करके डेटा को बचाना चाहिए और उसे फ़िल्टर करना चाहिए, या सभी JSON एन्कोडेड स्ट्रिंग को एक बार में से बचाना चाहिए?

दूसरी बात यह है कि मुझे यकीन नहीं है कि यू + 2028 और यू + 2029 वर्णों को PHP में कैसे बचाना है। क्या मैं सिर्फ str_replace कर सकता हूँ? मुझे यकीन नहीं है कि str_replace multibyte सुरक्षित है और no mb_str_replace फ़ंक्शन है जब तक कि मैं कुछ कस्टम किए गए एक का उपयोग नहीं करता। तो आप उन यूनिकोड वर्णों को कैसे हटाते/निकालते हैं?

बहुत बहुत धन्यवाद।

+1

जब तक मैं लेख को गलत ढंग से पढ़ा है, न तुम सिर्फ '\ u2028' से बदलने कर सकते हैं? – hafichuk

+0

'\ u2028' और' u2029' यूनिकोड न्यूलाइन वर्ण हैं। क्या आप चाहते हैं कि आपका एप्लिकेशन तारों में इन पात्रों को अनुमति दे? मतलब, जो भी आपके सर्वर पर इस पाठ को स्वीकार करता है सक्रिय रूप से सीआर/एलएफ को इन पात्रों में से एक में परिवर्तित करता है, क्योंकि वास्तव में कोई भी नए न्यूलाइन वर्णों का उपयोग नहीं करता है। मुझे शक है। मुझे लगता है कि आप बस सभी न्यूलाइन, सीआर/एलएफ, या नए को खत्म करना चाहते हैं। शाब्दिक भागने के दृश्यों को डालने के बजाय, उन मामलों में, बस उन्हें खत्म कर दें। –

उत्तर

18

आप "\u2028", "\u2029" के साथ या तो पीएचपी पक्ष या जावास्क्रिप्ट पक्ष, या दोनों पर U+2028, U+2029 की जगह ले सकता है, यह बात जब तक यह कम से कम एक बार होता है (यह idempotent) नहीं करता है।

आप साधारण स्ट्रिंग प्रतिस्थापन कार्यों का उपयोग कर सकते हैं। उन्हें "मल्टीबाइट सुरक्षित" होने की आवश्यकता नहीं है, और आप इसे किसी भी यूनिकोड एन्कोडिंग (यूटीएफ -8, यूटीएफ -16, यूटीएफ -32 में आसानी से ठीक कर सकते हैं)। पिछली बार जब मैंने जांच की थी कि PHP में यूनिकोड एस्केप अनुक्रम नहीं हैं, तो PHP एक मजाक क्यों है, लेकिन आप \x यूटएफ -8 के साथ बचने के लिए एक और कारण है ...

(संक्षेप में, कोई मल्टीबाइट नहीं है स्ट्रिंग की जगह समारोह है, क्योंकि यह निरर्थक हो सकता है - यह बिल्कुल वैसा ही किया जाएगा के रूप में एक गैर multibyte स्ट्रिंग समारोह की जगह)

// Javascript 
data = data.replace("\u2028", "\\u2028").replace("\u2029", "\\u2029"); 

// PHP 
$data = str_replace("\xe2\x80\xa8", '\\u2028', $data); 
$data = str_replace("\xe2\x80\xa9", '\\u2029', $data); 

या आप बस, कुछ भी नहीं कर सकता है के बाद से पीएचपी गैर यूनिकोड वर्ण निकल जाता है। json_encode() में डिफ़ॉल्ट रूप से:

// Safe 
echo json_encode("\xe2\x80\xa9"); 
--> "\u2029" 

// Correct JSON, but invalid Javascript... 
// (Well, technically, JSON root must be array or object) 
echo json_encode("\xe2\x80\xa9", JSON_UNESCAPED_UNICODE); 
--> " 
" 
+1

उत्कृष्ट उत्तर, धन्यवाद! मैं इसे json_encode() का उपयोग करके छोड़ सकता हूं क्योंकि ऐसा लगता है कि मेरे लिए सभी भागने वाले काम करते हैं। अच्छा काम जो भी उस समारोह को लिखा था! – zuallauz

+0

लेकिन यह यूटीएफ -8 मानता है। यदि आप एक अलग वर्ण एन्कोडिंग का उपयोग करते हैं तो वह तोड़ नहीं होगा? –

+0

लेकिन वह यूटीएफ -8 मानता है। यदि आप एक अलग वर्ण एन्कोडिंग का उपयोग करते हैं तो वह तोड़ नहीं होगा। –

0

यह इंगित करने लायक है कि यह अब आवश्यक नहीं है।

डिफ़ॉल्ट रूप से, json_encode() encodes सभी गैर- ASCII वर्ण (सहित U + 2028 & U + 2029), और भी फ़ॉरवर्ड स्लैश निकल जाता है, भले ही है कि JSON कल्पना की सहायता से निकले जाने की जरूरत नहीं है। इससे बचने के लिए कोई नुकसान नहीं होता है, और यह कुछ संदर्भों में सुरक्षित हो सकता है। तो, डिफ़ॉल्ट रूप से, ये वर्ण किसी भी तरह से बच निकले हैं।

JSON_UNESCAPED_UNICODE निरंतर आउटपुट अनचेक यूनिकोड, जो बाइट्स को बचा सकता है। हालांकि, जैसे स्लैश चरित्र बच निकला है क्योंकि यह कुछ संदर्भों में खतरनाक हो सकता है, इसलिए यू +2028 & यू + 2029 भी बच निकले, क्योंकि वे कुछ संदर्भों में भी खतरनाक हैं। जब आपने अपने प्रश्न से पूछा था तो यह मामला नहीं था: this feature has been added to PHP more recently

(ये अतिरिक्त पलायन JSON_UNESCAPED_SLASHES और JSON_UNESCAPED_LINE_TERMINATORS क्रमश साथ बंद कर दिया जा सकता है।)

संबंधित मुद्दे