আমি কীভাবে পালানো ইউনিকোডের সাথে একটি স্ট্রিং ডিকোড করব?


92

আমি নিশ্চিত না যে এটি কী বলা হয় তাই এটি অনুসন্ধানে আমার সমস্যা হচ্ছে। আমি কিভাবে থেকে ইউনিকোড সঙ্গে একটি স্ট্রিং ডিকোড করতে http\u00253A\u00252F\u00252Fexample.comকরতে http://example.comজাভাস্ক্রিপ্ট সঙ্গে? আমি চেষ্টা unescape, decodeURIএবং decodeURIComponentতাই আমি অনুমান শুধু বাম স্ট্রিং প্রতিস্থাপন করা হয়।

সম্পাদনা: স্ট্রিংটি টাইপ করা হয় না, বরং কোডের অন্য অংশ থেকে একটি স্ট্রিং থাকে। সুতরাং সমস্যা সমাধানের জন্য আপনাকে এই জাতীয় কিছু দিয়ে শুরু করতে হবে:

var s = 'http\\u00253A\\u00252F\\u00252Fexample.com';

আমি আশা করি এটি দেখায় যে কেন আনস্কেপ () কাজ করে না।


স্ট্রিং কোথা থেকে আসে?
ক্যামেরন

@ ক্যামেরন: স্ট্রিংটি একটি স্ক্রিপ্ট থেকে এসেছে যা পেতে আমি অভ্যন্তরীণ এইচটিএমএলকে কল করেছি। এ কারণেই অ্যালেক্সের উত্তর কার্যকর হয় না।
styfle

উত্তর:


113

সম্পাদনা (2017-10-12) :

@ মেচালিনেক্স এবং @ কেভিন-ওয়েবার নোট যা unescape()ব্রাউজার-বিহীন পরিবেশ থেকে অবহিত এবং টাইপস্ক্রিপ্টে নেই। decodeURIComponentএকটি ড্রপ-ইন প্রতিস্থাপন। বিস্তৃত সামঞ্জস্যের জন্য, পরিবর্তে নীচেরটি ব্যবহার করুন:

decodeURIComponent(JSON.parse('"http\\u00253A\\u00252F\\u00252Fexample.com"'));
> 'http://example.com'

আসল উত্তর:

unescape(JSON.parse('"http\\u00253A\\u00252F\\u00252Fexample.com"'));
> 'http://example.com'

আপনি সমস্ত কাজ এতে অফলোড করতে পারেন JSON.parse


7
মজাদার. আমার চারপাশে উক্তি যুক্ত করতে unescape(JSON.parse('"' + s + '"'));হয়েছিল অতিরিক্ত উদ্ধৃতির কারণ কী? এটি কি এটি বৈধ JSON করে?
styfle

4
নোট করুন যে এটি fromCharCodeপদ্ধতির চেয়ে উল্লেখযোগ্যভাবে দ্রুত বলে মনে হচ্ছে : jsperf.com/unicode-func-vs-json-parse
nrabinowitz

17
@ স্টাইলফলের উত্তরের বিষয়ে গুরুত্বপূর্ণ নোট: পরিবর্তে JSON.parse('"' + s + '"')অবিশ্বস্ত ডেটা ব্যবহারের সাথে ব্যবহার করার সময় ব্যবহার করবেন না JSON.parse('"' + s.replace('"', '\\"') + '"'), অন্যথায় ইনপুটটিতে কোটস থাকলে আপনার কোডটি ভেঙে যাবে
ntninja

7
অ্যালেক্সান্ডার ২৫৫ এর দুর্দান্ত উত্তর, তবে আপনি আসলে ব্যবহার করতে চান: JSON.parse ('' '+ str.replace (/ \ "/ g,' \\" '' '')) সমস্ত চরিত্রের সমস্ত উপস্থিতি প্রতিস্থাপন করতে স্ট্রিংয়ের পরিবর্তে একটি প্রতিস্থাপন করুন
সিএস

4
যারা এগুলি জুড়ে আসেন এবং চিন্তিত হন কারণ unescape()অবহেলিত হয়েছে, এই ক্ষেত্রে decodeURIComponent()একইরূপে কাজ করে unescape(), তাই কেবল এটির সাথে এটি প্রতিস্থাপন করুন এবং আপনি ভাল।
mechalynx

116

আপডেট : দয়া করে নোট করুন যে এটি এমন একটি সমাধান যা পুরানো ব্রাউজারগুলি বা ব্রাউজারবিহীন প্ল্যাটফর্মগুলিতে প্রয়োগ করা উচিত এবং নির্দেশমূলক উদ্দেশ্যে জীবিত রাখা উচিত। আরও আপ টু ডেট উত্তরের জন্য দয়া করে নীচে @ অ্যাডিক্যান্ডের উত্তরটি দেখুন।


এটি একটি ইউনিকোড, পালানো স্ট্রিং। প্রথমে স্ট্রিংটি পালানো হয়েছিল, তারপরে ইউনিকোড দিয়ে এনকোড করা হয়েছে। আবার স্বাভাবিক অবস্থায় রূপান্তর করতে:

var x = "http\\u00253A\\u00252F\\u00252Fexample.com";
var r = /\\u([\d\w]{4})/gi;
x = x.replace(r, function (match, grp) {
    return String.fromCharCode(parseInt(grp, 16)); } );
console.log(x);  // http%3A%2F%2Fexample.com
x = unescape(x);
console.log(x);  // http://example.com

ব্যাখ্যা করার জন্য: আমি সন্ধানের জন্য একটি নিয়মিত প্রকাশ ব্যবহার করি \u0025। তবে, যেহেতু আমার প্রতিস্থাপন অপারেশনের জন্য আমার এই স্ট্রিংয়ের কেবল একটি অংশ প্রয়োজন, তাই আমি যে অংশটি পুনরায় ব্যবহার করতে চাইছি তা আলাদা করতে আমি প্রথম বন্ধনী ব্যবহার করি 0025। এই বিচ্ছিন্ন অংশকে একটি গ্রুপ বলা হয়।

giঅভিব্যক্তি শেষে অংশ উল্লেখ করে তা শুধু প্রথম এক স্ট্রিং সমস্ত উদাহরণ মেলে উচিত এবং ম্যাচিং ক্ষেত্রে অবশ হওয়া উচিত যে। উদাহরণ হিসাবে দেওয়া এটিকে অপ্রয়োজনীয় মনে হতে পারে তবে এটি বহুমুখিতা যুক্ত করে।

এখন, একটি স্ট্রিং থেকে অন্য স্ট্রিংয়ে রূপান্তর করতে, আমাকে প্রতিটি ম্যাচের প্রতিটি গ্রুপে কিছু পদক্ষেপগুলি প্রয়োগ করতে হবে এবং আমি স্ট্রিংটিকে কেবল রূপান্তর করেই এটি করতে পারি না। সহায়কভাবে, স্ট্রিং.রেপ্লেস অপারেশন কোনও ফাংশন গ্রহণ করতে পারে, যা প্রতিটি ম্যাচের জন্য কার্যকর করা হবে। এই ফাংশনটির প্রত্যাবর্তন ম্যাচটিকে স্ট্রিংয়ের মধ্যে প্রতিস্থাপন করবে।

আমি এই ফাংশনটি গ্রহণ করে এমন দ্বিতীয় প্যারামিটারটি ব্যবহার করি, যা আমার প্রয়োজন সেই গোষ্ঠীটি, এবং এটিটিকে সমতুল্য utf-8 অনুক্রমে রূপান্তরিত করতে হবে, তারপরে বিল্টটি ব্যবহার করুন - unescapeস্ট্রিংটিকে তার সঠিক আকারে ডিকোড করতে।


4
ধন্যবাদ আপনি যা করছেন সে সম্পর্কে আপনি কিছুটা ব্যাখ্যা করতে পারেন? দেখে মনে হচ্ছে রেজেক্স একটি \uউপসর্গ এবং 4 টি অক্ষরের হেক্স সংখ্যা (অক্ষর বা সংখ্যা) চেয়ে সন্ধান করছে। প্রতিস্থাপন পদ্ধতিতে ফাংশনটি কীভাবে কাজ করে?
স্টাইল স্টাইল

4
আপনি ঠিক বলেছেন, এর ব্যাখ্যা দরকার, তাই আমি আমার পোস্টটি আপডেট করেছি। উপভোগ করুন!
আয়নানস কারাডিমাস

4
দুর্দান্ত সমাধান। আমার ক্ষেত্রে, আমি ইউনিকোডের হাত থেকে বাঁচার জন্য সার্ভার থেকে প্রেরিত সমস্ত আন্তর্জাতিক (অ-এসসিআই) অক্ষরগুলি এনকোড করছি, তারপরে অক্ষরগুলি ডিকোড করতে সঠিকভাবে ইউটিএফ -8 অক্ষরে ব্রাউজারে আপনার ফাংশনটি ব্যবহার করছি। আমি দেখতে পেলাম যে সমস্ত ভাষার অক্ষর (যেমন থাই) ধরার জন্য আমাকে নীচের রেজেক্স আপডেট করতে হয়েছিল:var r = /\\u([\d\w]{1,})/gi;
নাথান হান্না

4
নোট করুন যে এটি JSON.parseপদ্ধতির চেয়ে উল্লেখযোগ্যভাবে ধীর বলে মনে হচ্ছে : jsperf.com/unicode-func-vs-json-parse
nrabinowitz

4
@ আইওনিসকারাডিমাস এখানে অবশ্যই জাভাস্ক্রিপ্টে অবমূল্যায়নের মতো বিষয় রয়েছে। দাবি করা এবং তারপরে এটি সমর্থন করে যে পুরানো ব্রাউজারগুলি সর্বদা সমর্থিত হওয়া উচিত এটি সম্পূর্ণ অ্যাসিস্টোরিক দৃষ্টিভঙ্গি। যাই হোক না কেন, যে কেউ এটি ব্যবহার করতে চায় এবং এড়াতে চায় সে unescape()তার decodeURIComponent()পরিবর্তে ব্যবহার করতে পারে । এটি এক্ষেত্রে অভিন্নভাবে কাজ করে। আমি তবে রেডিক্যান্ডের পদ্ধতির সুপারিশ করব, যেমন এটি সহজ, ঠিক একইভাবে কার্যকর এবং কার্যকরভাবে কার্যকর একই ফলাফলগুলির সাথে (তবে মন্তব্যগুলি অবশ্যই পড়তে ভুলবেন না)।
mechalynx

21

নোট করুন যে ব্যবহারটি হ্রাস unescape()করা হয়েছে এবং উদাহরণস্বরূপ, টাইপস্ক্রিপ্ট সংকলকটির সাথে কাজ করে না।

রেডিক্যান্ডের উত্তর এবং নীচে মন্তব্য বিভাগের ভিত্তিতে, এখানে একটি আপডেট সমাধান রয়েছে:

var string = "http\\u00253A\\u00252F\\u00252Fexample.com";
decodeURIComponent(JSON.parse('"' + string.replace(/\"/g, '\\"') + '"'));

http://example.com


এটি কিছু স্ট্রিংয়ের জন্য কাজ করে না, কারণ উদ্ধৃতিগুলি JSON স্ট্রিংটি ভেঙে দিতে পারে এবং JSON পার্সিং ত্রুটির ফলস্বরূপ। আমি এই ক্ষেত্রে অন্যান্য উত্তর ( স্ট্যাকওভারফ্লো.com / a / 7885499 / 249327 ) ব্যবহার করেছি ।
নিকডোস

2

আমার কাছে বিদ্যমান উত্তরের মন্তব্যগুলিতে রাখার মতো যথেষ্ট প্রতিবেদন নেই:

unescapeকেবলমাত্র ইউআরআই (বা কোনও এনকোডেড ইউএফএফ -8) এর সাথে কাজ করার জন্য অবহেলিত যা সম্ভবত বেশিরভাগ মানুষের প্রয়োজনের ক্ষেত্রে। encodeURIComponentএকটি জেএস স্ট্রিংটিকে ইউটিএফ -8 থেকে পালাতে রূপান্তর করে এবং decodeURIComponentকেবল পালানো ইউটিএফ -8 বাইটে কাজ করে। এটি এমন কিছুর জন্য ত্রুটি ছুঁড়ে দেয় decodeURIComponent('%a9'); // errorকারণ বর্ধিত এসসিআইটি ইউটিএফ -8 বৈধ নয় যদিও (যদিও এটি এখনও একটি ইউনিকোড মান), তবে unescape('%a9'); // ©ডিকোডিউরিক উপাদান ব্যবহার করার সময় আপনাকে আপনার ডেটা জানা দরকার to

ডিকোডিউরিক কম্পোনেন্ট কাজ করবে না "%C2"বা কোনও লোন বাইট ছাড়বে না 0x7fকারণ utf-8 এ একটি সারোগেটের অংশ নির্দেশ করে। তবে decodeURIComponent("%C2%A9") //gives you ©ইউনেস্কেপ সেটিতে সঠিকভাবে কাজ করবে না // ©এবং এটি কোনও ত্রুটি ফেলবে না, সুতরাং ইউনেস্কেপ আপনার ডেটা না জানলে বগি কোডের দিকে নিয়ে যেতে পারে।


1

এর 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');
// yields "http%3A%2F%2Fexample.com"
// Then you can use decodeURIComponent to further decode it:
let step2 = decodeURIComponent(step1);
// yields http://example.com
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.