এর JSON.decode
জন্য ব্যবহার করা তাৎপর্যপূর্ণ ত্রুটিগুলি নিয়ে আসে যা সম্পর্কে আপনাকে সচেতন হতে হবে:
- আপনার অবশ্যই ডাবল উদ্ধৃতিতে স্ট্রিংটি মোড়তে হবে
- অনেকগুলি অক্ষর সমর্থিত নয় এবং তাদের নিজেরাই পালাতে হবে। উদাহরণ হিসেবে বলা যায়, এর নিম্নলিখিত কোন ক্ষণস্থায়ী
JSON.decode
(তাদের উদ্ধৃতি চিহ্ন মধ্যে মোড়কে পর) যদিও এই সব বৈধ ত্রুটি হবে: \\n
, \n
, \\0
,a"a
- এটি হেক্সাডেসিমাল পলায়ন সমর্থন করে না:
\\x45
- এটি ইউনিকোড কোড পয়েন্ট ক্রমগুলি সমর্থন করে না:
\\u{045}
পাশাপাশি অন্যান্য ক্যাভেট রয়েছে। মূলত, JSON.decode
এই উদ্দেশ্যে ব্যবহার করা একটি হ্যাক এবং আপনি সর্বদা প্রত্যাশা মতো কাজ করেন না। 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
মন্তব্য করা হয়েছে (দ্রষ্টব্য: এই রেজেক্সটি অবৈধগুলি সহ সমস্ত পালানোর ক্রমের সাথে মেলে। স্ট্রিংটি যদি জেএসে একটি ত্রুটি ফেলতে পারে তবে এটি আমার লাইব্রেরিতে একটি ত্রুটি ফেলে দেয় [অর্থাত্ '\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);