PHP unserialize fails with non-encoded characters? -


  $ ser = 'a: 2: {i: 0; s: 5: "héllö" i: 1 की: 5: "दुनिया";} '; // विफल $ ser2 = 'a: 2: {i: 0; s: 5: "हैलो"; i: 1; s: 5: "विश्व";}'; // $ बाहर काम करता है = unserialize ($ सेवा); $ Out2 = अनसियलाइज़ ($ ser2); print_r (बाहर $); print_r ($ out2); गूंज "& lt; hr & gt;";  

लेकिन क्यों?
क्या मैं सीरियलज़िंग से पहले सांकेतिक शब्दों में कहें?

<<> फ़ंक्शन लिखना IMGData () {Var caption_arr = नया अर्रे (); $ ('। एल्बम आईएमजी')। प्रत्येक (फ़ंक्शन (इंडेक्स) {caption_arr.push ($ (यह) .attr ('alt'))}}; $ ("# छिपे हुए फ़ील्ड")। एट्र ("मान", सीरियलाइज़ एरे (कैप्शन_आआर)); };

कारण unserialize () के साथ विफल रहता है: < / P>

  $ ser = 'a: 2: {i: 0; s: 5: "héllö"; i: 1; s: 5: "wörld";}';  

इसका कारण यह है कि héllö और wörld के लिए लंबाई गलत है, क्योंकि PHP मूलतः बाइट स्ट्रिंग को मूल रूप से नहीं संभालता है: < / P> <पूर्व> इको स्ट्रेलन ('हेलो'); // 7 गूंज स्ट्रेलन ('wörld'); // 6

हालांकि यदि आप unserialize () निम्न सही स्ट्रिंग करने का प्रयास करते हैं:

  $ ser = 'a: 2: {मैं: 0; रों: 7: "नमस्ते", मैं: 1; रों: 6: "दुनिया";} '; गूंज '& lt; पूर्व & gt;'; print_r (unserialize ($ सेवा)); गूंज & lt; / pre & gt; ';  

यह काम करता है:

  अर्रे ([0] = & gt; हैलो [1] = & gt; wörld)  
< P> यदि आप PHP serialize () का उपयोग करते हैं तो उसे मल्टी-बाइट स्ट्रिंग इंडेक्सस की लंबाई की गणना करना चाहिए। दूसरी ओर, यदि आप सीरियल डेटा के साथ काम करना चाहते हैं कई प्रोग्रामिंग भाषाएं आपको इसे भूल जाएं और JSON की तरह कुछ ले जाएं, जो कि अधिक मानकीकृत है।


Comments