इसके लिए उपयोग में JSON.decode
महत्वपूर्ण कमियां हैं जिनसे आपको अवगत होना चाहिए:
- आपको स्ट्रिंग को डबल कोट्स में लपेटना होगा
- कई पात्रों का समर्थन नहीं किया जाता है और खुद को बच जाना चाहिए। उदाहरण के लिए, करने के लिए निम्न में से कोई गुजर
JSON.decode
(उनमें दोहरे उद्धरण में लपेटकर के बाद) भले ही इन सभी मान्य हैं त्रुटि देगा: \\n
, \n
, \\0
,a"a
- यह हेक्साडेसिमल से बचने का समर्थन नहीं करता है:
\\x45
- यह यूनिकोड कोड बिंदु अनुक्रमों का समर्थन नहीं करता है:
\\u{045}
वहाँ अन्य caveats भी हैं। अनिवार्य रूप से, JSON.decode
इस उद्देश्य के लिए उपयोग करना एक हैक है और वह काम नहीं करता है जिस तरह से आप हमेशा उम्मीद कर सकते हैं। आपको JSON
JSON को संभालने के लिए लाइब्रेरी का उपयोग करने के साथ रहना चाहिए , न कि स्ट्रिंग संचालन के लिए।
मैं हाल ही में इस मुद्दे पर स्वयं गया था और एक मजबूत डिकोडर चाहता था, इसलिए मैंने खुद को लिखना समाप्त कर दिया। यह पूर्ण और अच्छी तरह से परीक्षण है और यहां उपलब्ध है: https://github.com/iansan5653/unraw । यह जावास्क्रिप्ट मानक की यथासंभव निकटता की नकल करता है।
स्पष्टीकरण:
स्रोत लगभग 250 रेखाएँ हैं इसलिए मैं इसे यहाँ सब शामिल नहीं करूँगा, लेकिन अनिवार्य रूप से यह सभी एस्केप अनुक्रमों को खोजने के लिए निम्न रेगेक्स का उपयोग करता है और फिर parseInt(string, 16)
आधार -16 संख्याओं को डिकोड String.fromCodePoint(number)
करने के लिए और फिर संबंधित वर्ण प्राप्त करने के लिए उनका उपयोग करता है :
/\\(?:(\\)|x([\s\S]{0,2})|u(\{[^}]*\}?)|u([\s\S]{4})\\u([^{][\s\S]{0,3})|u([\s\S]{0,4})|([0-3]?[0-7]{1,2})|([\s\S])|$)/g
टिप्पणी (नोट: यह regex सभी से बचने के अनुक्रमों से मेल खाता है, जिसमें अमान्य भी शामिल हैं। यदि स्ट्रिंग JS में कोई त्रुटि फेंकती है, तो यह मेरी लाइब्रेरी में एक त्रुटि फेंकता है (यानी, '\x!!'
त्रुटि होगी]):
/
\\ # All escape sequences start with a backslash
(?: # Starts a group of 'or' statements
(\\) # If a second backslash is encountered, stop there (it's an escaped slash)
| # or
x([\s\S]{0,2}) # Match valid hexadecimal sequences
| # or
u(\{[^}]*\}?) # Match valid code point sequences
| # or
u([\s\S]{4})\\u([^{][\s\S]{0,3}) # Match surrogate code points which get parsed together
| # or
u([\s\S]{0,4}) # Match non-surrogate Unicode sequences
| # or
([0-3]?[0-7]{1,2}) # Match deprecated octal sequences
| # or
([\s\S]) # Match anything else ('.' doesn't match newlines)
| # or
$ # Match the end of the string
) # End the group of 'or' statements
/g # Match as many instances as there are
उदाहरण
उस पुस्तकालय का उपयोग करना:
import unraw from "unraw";
let step1 = unraw('http\\u00253A\\u00252F\\u00252Fexample.com');
let step2 = decodeURIComponent(step1);