"অপ্রত্যাশিত টোকেন অবৈধ" এর জন্য কোন দৃশ্যমান কারণ


270

আমি আমার কনসোলটিতে এই জাভাস্ক্রিপ্ট ত্রুটি পেয়েছি:

আনকাচড সিনট্যাক্স এরিয়ার: অপ্রত্যাশিত টোকেন ইলিজেল

এটি আমার কোড:

var foo = 'bar';​

এটি দেখতে খুব সহজ as এটি কীভাবে সিন্ট্যাক্স ত্রুটির কারণ হতে পারে?


9
ভবিষ্যতে পাঠকদের জন্য:: - যদি এই ত্রুটি দ্য ভাগ্রান্ট ব্যবহার সম্মুখীন এই উত্তরটি এছাড়াও সহায়ক হতে পারে stackoverflow.com/questions/9479117/...
OZ_

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

7
মডারেটরের দ্রষ্টব্য: আমি এখানে বেশ কিছু উত্তর মুছলাম যা আসলে প্রশ্নের উত্তর দেয় না। এটি জাভাস্ক্রিপ্টে আপনি করতে পারেন এমন প্রতিটি সম্ভাব্য জিনিসের তালিকা করার একটি জায়গা যা এই ত্রুটির ফলশ্রুতিতে নয় not প্রশ্নটির একটি খুব নির্দিষ্ট পরিস্থিতি রয়েছে যা সেই পরিস্থিতিতে কোনও জড়িত নয় এবং এই সমস্ত উদাহরণ কেবল প্রশ্নের উত্তর দেয় না
animuson

3
বাহ, এই প্রশ্নটি নিয়ে এসও পুলিশদের একটি মাঠের দিন ছিল। ভাগ্যক্রমে, কিছু প্রাসঙ্গিক তথ্য মুছে ফেলা উত্তরে এখনও দৃশ্যমান।
সিডনার

উত্তর:


493

ভূল

কোডটি জাভাস্ক্রিপ্ট দোভাষী দ্বারা বিশ্লেষণ করা হলে, এটি "টোকেন" নামে টুকরো টুকরো হয়ে যায়। যখন একটি টোকেনকে চারটি বেসিক টোকেন ধরণের মধ্যে শ্রেণীবদ্ধ করা যায় না, বেশিরভাগ বাস্তবায়নের উপর এটি "ILLEGAL" লেবেলযুক্ত হয় এবং এই ত্রুটি নিক্ষেপ করা হয়।

একই ত্রুটি উত্থাপিত হয়, উদাহরণস্বরূপ, আপনি যদি দুর্বৃত্ত @চরিত্র, একটি বিভক্ত কোঁকড়ানো ধনুর্বন্ধনী, বন্ধনী, "স্মার্ট উদ্ধৃতি", একক উদ্ধৃতি সঠিকভাবে আবদ্ধ না হয় (উদাহরণস্বরূপ this.run('dev1)) ইত্যাদির সাহায্যে জেএস ফাইল চালানোর চেষ্টা করেন।

বিভিন্ন পরিস্থিতিতে অনেকগুলি এই ত্রুটি ঘটাতে পারে। তবে আপনার যদি স্পষ্টত বাক্য গঠন ত্রুটি বা অবৈধ চরিত্র না থাকে তবে এটি অদৃশ্য অবৈধ চরিত্রের কারণে ঘটতে পারে । এই উত্তর সম্পর্কে যা হয়।

তবে আমি অবৈধ কিছু দেখতে পাচ্ছি না!

কোডটিতে একটি অদৃশ্য চরিত্র রয়েছে, সেমিকোলনের ঠিক পরে। এটি ইউনিকোড U+200Bজিরো-প্রস্থের স্থানের অক্ষর (ওরফে ZWSP, এইচটিএমএল সত্তা ​)। এই চরিত্রটি Unexpected token ILLEGALজাভাস্ক্রিপ্ট সিনট্যাক্স ত্রুটির কারণ হিসাবে পরিচিত ।

আর কোথা থেকে এলো?

আমি নিশ্চিত করে বলতে পারছি না, তবে আমার বাজিটি jsfiddle এ আছে । আপনি যদি সেখান থেকে কোডটি পেস্ট করেন তবে এটির মধ্যে সম্ভবত এক বা একাধিক U+200Bঅক্ষর অন্তর্ভুক্ত রয়েছে । দেখে মনে হচ্ছে দীর্ঘ অক্ষরে শব্দ-মোড়ানো নিয়ন্ত্রণ করার জন্য সরঞ্জামটি সেই অক্ষরটি ব্যবহার করে।

আপডেট 2013-01-07

সর্বশেষ জেসফিডাল আপডেটের পরে , এটি এখন কোডেপেনের মতো লাল বিন্দুর মতো চরিত্রটি দেখাচ্ছেস্পষ্টতই , এটি U+200Bনিজের নিজের থেকে অক্ষরগুলি সন্নিবেশও করছে না, এখন থেকে এই সমস্যাটি কম ঘন ঘন হওয়া উচিত।

আপডেট 2015-03-17

ভার্চুয়ালবক্সে বাগের কারণে মাঝে মাঝে ভ্যাগ্র্যান্ট এই সমস্যাটি দেখা দেয় । এই ব্লগ পোস্ট অনুসারে সমাধানটি হ'ল sendfile off;আপনার এনজিএনএক্স কনফিগারেশনে সেট করা বা EnableSendfile Offআপনি যদি অ্যাপাচি ব্যবহার করেন।

এটি আরও জানা গেছে যে ক্রোম বিকাশকারী সরঞ্জামগুলি থেকে আটকানো কোডটিতে সেই চরিত্রটি অন্তর্ভুক্ত থাকতে পারে তবে আমি বর্তমান সংস্করণ (ওএসএক্সে 22.0.1229.79) সহ এটি পুনরুত্পাদন করতে পারিনি।

আমি কীভাবে এটি স্পট করতে পারি?

চরিত্রটি অদৃশ্য, কীভাবে আমরা জানি যে এটি সেখানে রয়েছে? আপনি আপনার সম্পাদককে অদৃশ্য অক্ষরগুলি প্রদর্শন করতে বলতে পারেন। বেশিরভাগ পাঠ্য সম্পাদকদের এই বৈশিষ্ট্য রয়েছে। উদাহরণস্বরূপ, ভিম এগুলি ডিফল্টরূপে প্রদর্শন করে এবং এর ZWSPমতো করে শো করে <u200b>। আপনি এটি অনলাইনে ডিবাগও করতে পারেন: জেসবিন তার কোড প্যানে লাল বর্ণের মতো চরিত্রটি প্রদর্শন করে (তবে পৃষ্ঠাটি সংরক্ষণ এবং পুনরায় লোড করার পরে এটি মুছে ফেলা হবে বলে মনে হয়)। কোডপেন.ইও এটিকে বিন্দু হিসাবে প্রদর্শন করে এবং সংরক্ষণ করার পরেও তা রাখে।

সম্পর্কিত সমস্যা

এই চরিত্রটি খারাপ কিছু নয়, এটি আসলে বেশ কার্যকর হতে পারে। উইকিপিডিয়ায় এই উদাহরণটি প্রদর্শন করে যে এটি কীভাবে একটি দীর্ঘ স্ট্রিং পরের লাইনে আবৃত করা উচিত তা নিয়ন্ত্রণ করতে ব্যবহার করা যেতে পারে। তবে, আপনি যদি আপনার মার্কআপে চরিত্রটির উপস্থিতি সম্পর্কে অবগত না হন, এটি সমস্যা হতে পারে। যদি আপনার স্ট্রিংটির অভ্যন্তরে থাকে (উদাহরণস্বরূপ, nodeValueকোনও ডিওএম উপাদান যার কোনও দৃশ্যমান সামগ্রী নেই) তবে আপনি আশা করতে পারেন যে এই স্ট্রিংটি খালি থাকবে, যখন বাস্তবে এটি নেই (প্রয়োগ করার পরেও String.trim)।

ZWSPএইচটিএমএল পৃষ্ঠায় অতিরিক্ত শ্বেত স্থান প্রদর্শিত হতে পারে, উদাহরণস্বরূপ যখন এটি দুটি <div>উপাদানগুলির মধ্যে পাওয়া যায় (যেমন এই প্রশ্নটিতে দেখা যায় )। চরিত্রটি সেখানে উপেক্ষা করা হওয়ায় এই কেসটি জিসফিডালে পুনরুত্পাদনযোগ্যও নয়।

আর একটি সম্ভাব্য সমস্যা: যদি ওয়েব পৃষ্ঠার এনকোডিংটি ইউটিএফ -8 হিসাবে স্বীকৃতি না দেয় তবে চরিত্রটি প্রকৃতপক্ষে প্রদর্শিত হতে পারে ( ​উদাহরণস্বরূপ লাতিন 1-তে)।

যদি ZWSPসিএসএস কোডে উপস্থিত থাকে (ইনলাইন কোড, বা একটি বাহ্যিক স্টাইলশিট), শৈলীগুলিও সঠিকভাবে পার্স করা যায় না, তাই কিছু শৈলী প্রয়োগ করা যায় না ( এই প্রশ্নটিতে দেখা যায়) )।

ECMAScript নির্দিষ্টকরণ

ECMAScript স্পেসিফিকেশন (সংস্করণ 3 এবং 5.1 ) তে আমি সেই নির্দিষ্ট চরিত্রের কোনও উল্লেখ পাইনি । বর্তমান সংস্করণে বিভাগ 7.1 তে অনুরূপ অক্ষর ( U+200Cএবং U+200D) উল্লেখ করা হয়েছে , যা বলে যে "মন্তব্য, স্ট্রিং লিটারাল এবং নিয়মিত প্রকাশের আক্ষরিক বাইরে" যখন সেগুলি হিসাবে বিবেচনা করা উচিত । এই অক্ষরগুলি উদাহরণস্বরূপ, একটি চলক নামের অংশ হতে পারে (এবংIdentifierPartvar x\u200c; প্রকৃতপক্ষে কাজ করে)।

বিভাগ 7.2 বৈধ হোয়াইট স্পেস অক্ষর (যেমন ট্যাব, স্পেস, নন-ব্রেক স্পেস ইত্যাদি) তালিকাভুক্ত করে এবং অস্পষ্টভাবে উল্লেখ করেছে যে অন্য কোনও ইউনিকোড "স্পেস বিভাজক" (বিভাগ "জেডএস") সাদা স্থান হিসাবে বিবেচিত হওয়া উচিত। আমি সম্ভবত এই বিষয়ে চশমাগুলি নিয়ে আলোচনা করার জন্য সেরা ব্যক্তি নই, তবে আমার কাছে এটি U+200Bঅনুযায়ী সাদা স্থান হিসাবে বিবেচনা করা উচিত বলে মনে হয় , যখন বাস্তবে বাস্তবায়নগুলি (কমপক্ষে ক্রোম এবং ফায়ারফক্স) তাদেরকে অপ্রত্যাশিত হিসাবে বিবেচনা করে টোকেন (বা এর একটি অংশ), সিনট্যাক্স ত্রুটির সৃষ্টি করে।


codepen.io এছাড়াও এই চরিত্রটি প্রদর্শিত হবে। ভিআইএম এবং ষষ্ঠ, নোটপ্যাড ++ এটি প্রদর্শন করে।
rlemon

ধন্যবাদ @ রলেমন, উত্তরে একটি কোডপেন উদাহরণ যুক্ত করলেন। সুন্দর সাইট, আমি এটি সম্পর্কে জানতাম না।
bfavareto

পরীক্ষার দুটি ক্লাসের জন্য কোডটি অনুলিপি / পেস্ট করার সময় এই খুব সমস্যায় পড়ে ক্রোমিয়াম ব্যবহার করে এই এসও প্রশ্ন । স্পষ্টতই, শব্দের সংশ্লেষের হাইলাইটিংয়ে পার্সারটি চেপে গিয়েছিল function, যা ভিমে অদৃশ্য ছিল যতক্ষণ না আমি এটিকে "সমস্ত মুদ্রণযোগ্য অক্ষর হাইলাইট" FAQ পদ্ধতি ব্যবহার করে তা হাইলাইট না করি ighted আহ্ খুব ভাল লাগত যদি 32..127 এর মধ্যে কেবল অক্ষরের অনুলিপি করার কোনও উপায় থাকত (তবে সম্ভবত এটির জন্য একটি অ্যাপ্লিকেশন রয়েছে :))
ack

1
@ বিভাভেরেটো, কেবল সম্পাদনা মোডে কোড স্নিপেটে। প্রশ্নের শরীরে নয়, এটি উল্লেখ করা উচিত ছিল। (ক্রোম 43.0.2357.124 মি পরীক্ষিত)
ফার্নান্দো লিয়াল

1
অনেক পাঠ্য সম্পাদক একটি ফাইলের অক্ষর এনকোডিং স্যুইচ করার অনুমতি দেয়। এটির মতো আপত্তিকর চরিত্রগুলি খুঁজে পেতে এটি অত্যন্ত কার্যকর। আমার সমাধানটি ছিল ইউটিএফ -8 থেকে অস্থায়ীভাবে একটি এএনএসআই এনকোডিংয়ে সরিয়ে নেওয়া, অবৈধ অক্ষরগুলি সরিয়ে, তারপরে ফিরে যেতে। আমি উইন্ডোজে ফ্রিওয়্যার নোটপ্যাড ++ ব্যবহার করেছি। সম্পাদনা: দেখা যাচ্ছে আমি "সমস্ত অক্ষর প্রদর্শন করার জন্য" নোটপ্যাড ++ বিকল্পটি মিস করেছি। একই ফলাফল, কম ঝামেলা: ডি
এমবারগেইল

64

আপনি কেন আপনার কোডটিতে এই সমস্যাটি খুঁজছেন? এমনকি, যদি এটি কপিপস্ট করা হয়।

যদি আপনি দেখতে পান যে সিঙ্ক করা ফোল্ডারে ফাইল সংরক্ষণের পরে ঠিক কী ঘটছে - আপনি *****ফাইলের শেষে এমন কিছু দেখতে পাবেন । এটি আপনার কোডের সাথে মোটেই সম্পর্কিত নয়।

সমাধান।

যদি আপনি nginxভ্যাব্রেন্ট বাক্সে ব্যবহার করছেন - সার্ভার কনফিগারেশনে যুক্ত করুন:

sendfile off;

যদি আপনি apacheভ্যাব্রেন্ট বাক্সে ব্যবহার করছেন - সার্ভার কনফিগারেশনে যুক্ত করুন:

EnableSendfile Off;

সমস্যার উত্স: ভার্চুয়ালবক্স বাগ


6
আপনি আক্ষরিকভাবে আমার দিনটি বাঁচিয়েছিলেন। আমি পুরো সন্ধ্যা অবধি Nginx + Vagrant এর সাথে লড়াই করেছি এবং এটি এটিকে সমাধান করেছে।
ফ্রেডেভ

2
কি না আশা এই (আমার জন্য) কিন্তু এটা ছিল ধন্যবাদ এত সঠিক উত্তর হতে।
শার্লট

2
আসলে, এটি কাজ করা বন্ধ করে দিয়েছে। তারপরে আবার এখানে প্লেতে একাধিক স্তর সিমলিংক রয়েছে যাতে আমি কী করতে পারি তা কেবল অস্বীকার করি।
শার্লোট

ধন্যবাদ - আমি এনজিএনএক্স সহ একটি ভ্রমন বাক্সে ছিলাম অনুরূপ অ্যাপাচি সেটআপগুলিতেও আমি এই সমস্যাটি দেখেছি।
ক্যামেরন

অ্যাপাচি এর জন্য: সক্ষম করুন সেন্ডফিল অফ
জামেলি

7

আপনি যদি অন্য কোন দস্তাবেজ (পিডিএফ এর মতো) কোডটি আপনার কনসোলটিতে অনুলিপি করে এবং এটি চালানোর চেষ্টা করছেন তবে এটিও ঘটতে পারে।

আমি যে জাভাস্ক্রিপ্ট বইটি পড়ছি তার মধ্যে থেকে কয়েকটি উদাহরণ কোড চালানোর চেষ্টা করছিলাম এবং অবাক হয়ে গিয়েছিলাম এটি কনসোলে চালিত হয়নি।

স্পষ্টতই, পিডিএফ থেকে অনুলিপি কিছু অপ্রত্যাশিত, অবৈধ এবং কোডে অদৃশ্য অক্ষরগুলির সাথে পরিচয় করিয়ে দেয়।


5

আমার ম্যাকের ক্ষেত্রেও আমার একই সমস্যা ছিল এবং এটি খুঁজে পেয়েছিলাম কারণ ম্যাকটি স্ট্যান্ডার্ড কোটগুলিকে কোঁকড়ানো উদ্ধৃতিগুলির সাথে প্রতিস্থাপন করছে যা অবৈধ জাভাস্ক্রিপ্টের অক্ষর।

এটি ঠিক করতে আমাকে আমার ম্যাক সিস্টেম পছন্দসমূহ => কীবোর্ড => পাঠ্য (ট্যাব) এর স্মার্ট উদ্ধৃতি এবং ড্যাশগুলি ব্যবহার করতে হবে (ডিফল্ট চেক করা হয়েছিল) এর সেটিংস পরিবর্তন করতে হয়েছিল।


5

ক্রোমে আমি এই ত্রুটিটি পেয়েছি যখন আমার ত্রুটিটি রেখার রেখার পরে একটি নির্ধারিত স্ট্রিং থাকে। স্ট্রিংটি বন্ধ করার পরে ত্রুটিটি চলে যায়।

ত্রুটির সাথে উদাহরণ:

var file = files[i]; // SyntaxError: Unexpected token ILLEGAL

jQuery('#someDiv').innerHTML = file.name + " (" + formatSize(file.size) + ") "
    + "<a href=\"javascript: something('"+file.id+');\">Error is here</a>";

ত্রুটিবিহীন উদাহরণ:

var file = files[i]; // No error

jQuery('#someDiv').innerHTML = file.name + " (" + formatSize(file.size) + ") "
    + "<a href=\"javascript: something('"+file.id+"');\">Error was here</a>";

2
পার্থক্যটি সনাক্ত করার জন্য আমাকে আপনার দুটি উদাহরণের মধ্যে একটি পার্থক্য চালাতে হয়েছিল এবং একবার আমি তাৎক্ষণিকভাবে আমার নিজের সমস্যাটি বের করে ফেললাম।
বেন হ্যারল্ড

3

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

  1. Nginx.conf এ সেন্ডফিল বন্ধ

  2. uwsgi অ্যাপ্লিকেশন / কনফিগারেশন - অক্ষম-প্রেরণ ফাইল


2

ওএস এক্স চলাকালীন, ফাইল সিস্টেমটি আপনার সমস্ত ফাইলের মূলত লুকানো কাঁটা তৈরি করে, যদি তারা কোনও হার্ড ড্রাইভে থাকে যা এইচএফএস + সমর্থন করে না। এটি কখনও কখনও (আমার কাছে এখনই ঘটেছিল) আপনার জাভাস্ক্রিপ্ট ইঞ্জিনে নেতৃত্ব দিতে পারে যে কোডটি আপনি চালানোর ইচ্ছায় কোডটির পরিবর্তে ডেটা ফর্ক চালানোর চেষ্টা করে। যখন এটি ঘটবে, আপনিও পাবেন

SyntaxError: Unexpected token ILLEGAL

কারণ আপনার ফাইলের ডেটা ফর্কটিতে ইউনিকোড ইউ + 200 বি অক্ষর থাকবে। ডেটা ফর্ক ফাইলটি সরিয়ে ফেললে আপনার স্ক্রিপ্টটি আপনার কোডের বাইনারি ডেটা ফর্কটির পরিবর্তে আপনার আসল, অভিযুক্ত কোড চালাবে।

যাই হোক না কেন: এই ফাইলগুলি এমন ভলিউমগুলিতে তৈরি করা হয়েছে যা সম্পূর্ণ এইচএফএস ফাইলের বৈশিষ্ট্যগুলিকে সমর্থন করে না (উদাঃ ইউএফএস ভলিউম, উইন্ডোজ ফাইলগুলি ইত্যাদি)। যখন কোনও ম্যাক ফাইলটি এই জাতীয় ভলিউমে অনুলিপি করা হয়, তখন এর ডেটা ফর্কটি ফাইলের নিয়মিত নামের অধীনে সংরক্ষণ করা হয় এবং অতিরিক্ত এইচএফএসের তথ্য (রিসোর্স ফর্ক, প্রকার ও স্রষ্টা কোড ইত্যাদি) একটি দ্বিতীয় ফাইলে (অ্যাপলডুবাল ফর্ম্যাটে) সংরক্ষণ করা হয়, " " দিয়ে শুরু হওয়া নামের সাথে with (এই ফাইলগুলি অবশ্যই ওএস-এক্স সম্পর্কিত যতদূর অদৃশ্য, তবে অন্য ওএসের নয়, এটি কখনও কখনও বিরক্তিকর হতে পারে ...)


1

এখানে আমার কারণ:

আগে:

var path = "D:\xxx\util.s"

যা \uএকটি পালাবার, আমি কোডেপেন ব্যবহার করে এটি আবিষ্কার করেছি বিশ্লেষণ জেএস ।

পরে:

var path = "D:\\xxx\\util.s"

এবং ত্রুটি স্থির


0

আমার একই সমস্যা ছিল এবং এটি ঘটেছিল কারণ আমি একটি পাঠ্য স্ট্রিংয়ে কোড যুক্ত করার সময় এন্টার কীটি চাপলাম।

কারণ এটি পাঠ্যের দীর্ঘ স্ট্রিং ছিল আমি আমার পাঠ্য সম্পাদকটিতে স্ক্রোল না করেই এটি দেখতে চেয়েছিলাম, তবে এন্টার চাপলে স্ট্রিংটিতে একটি অদৃশ্য চরিত্র যুক্ত হয়েছিল যা অবৈধ was আমি আমার সম্পাদক হিসাবে সাবলাইম পাঠ্য ব্যবহার করছিলাম।


0

আমি সমস্ত স্থানের স্থানটিকে & nbsp তে পরিবর্তন করেছি, ঠিক এটির মতো এবং এটি কোনও সমস্যা ছাড়াই কাজ করেছে।

ভাল.রেপ্লেস ("", "& nbsp");

আমি আশা করি এটি কাউকে সাহায্য করবে


0

আমি গাদা আরও একটি উত্তর যুক্ত করতে যাচ্ছি। এই সমস্যাটি এনকোডিংয়ের কারণেও ঘটতে পারে। আপনি utf8 এনকোডিংটি নিরাপদ পাশে থাকতে চান want কিছু সম্পাদক ডিফল্টরূপে utf16 ব্যবহার করে যা সমস্যার কারণ হতে পারে। এটি পরীক্ষা করার একটি দ্রুত উপায়, উদাহরণস্বরূপ, ভিএস কোডে, কেবল একই বিষয়বস্তুটি পুনরায় তৈরি করুন তবে ফাইলটি তৈরি করতে vscode এর স্থানীয় সম্পাদক ব্যবহার করুন। আশা করি এটি কিছুটা সাহায্য করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.