পিছনে লেখা এই কোডটি কেন “হ্যালো ওয়ার্ল্ড!” প্রিন্ট করে?


261

এখানে কিছু কোড যা আমি ইন্টারনেটে পেয়েছি:

class M‮{public static void main(String[]a‭){System.out.print(new char[]
{'H','e','l','l','o',' ','W','o','r','l','d','!'});}}    

এই কোডটি Hello World!স্ক্রিনে মুদ্রণ করে; আপনি এটি এখানে চলতে দেখতে পারেন । আমি পরিষ্কারভাবে public static void mainলিখিত দেখতে পাচ্ছি , তবে এটি পিছনের দিকে। এই কোডটি কীভাবে কাজ করে? এটি কীভাবে সংকলন করে?

সম্পাদনা করুন: আমি এই কোডটি ইন্টেলিজজে চেষ্টা করেছিলাম, এবং এটি দুর্দান্ত কাজ করে। তবে কোনও কারণে এটি নোটপ্যাড ++, সেমিডি সহ কাজ করে না। আমি এখনও এর সমাধান পাইনি, সুতরাং কেউ যদি তা করে তবে নীচে মন্তব্য করুন।


38
এটি একটি মজার ... আরটিএল সমর্থন দিয়ে কিছু করার আছে?
ইউজিন শ।

12
ইউনিকোড চরিত্রটি রয়েছে # 8237; ঠিক তার পরেও Mএবং পরেও []a: fileformat.info/info/unicode/char/202d/index.htm এটিকে বাম-থেকে-
ডানদিকে

45
বাধ্যতামূলক xkcd: xkcd.com/1137
প্যাক 01

4
আপনার মাউস ব্যবহার করে কোড স্নিপেটে কেবল নির্বাচন করে আপনি এখানে খুব সহজেই দেখতে পাচ্ছেন।
Andreas Rejbrand

14
niam diov citats cilbupল্যাটিন প্রবাদটির মতো শোনাচ্ছে ..
মিক মোনমনিক

উত্তর:


250

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

এখানে সেই অনুলিপি-পেস্টের আউটপুট দেওয়া হচ্ছে:

"class M\u202E{public static void main(String[]a\u202D){System.out.print(new char[]\n"+
        "{'H','e','l','l','o',' ','W','o','r','l','d','!'});}}   "

উত্স কোড অক্ষরগুলি এই ক্রমে সংরক্ষণ করা হয়, এবং সংকলক তাদের এই ক্রমে হিসাবে বিবেচনা করে তবে সেগুলি অন্যরকম প্রদর্শিত হয়।

\u202Eঅক্ষরটি নোট করুন , যা ডান থেকে বাম ওভাররাইড, এমন একটি ব্লক শুরু করুন যেখানে সমস্ত অক্ষরকে ডান থেকে বামে প্রদর্শিত হতে বাধ্য করা হয় এবং একটি \u202D, যা নীচে থেকে ডানে ওভাররাইড হয়, সেখানে নেস্টেড ব্লক শুরু করে যেখানে সমস্ত অক্ষরগুলি প্রথম ওভাররাইডকে ওভাররাইড করে বাম থেকে ডান ক্রমে বাধ্য করা হয়।

এরগো, যখন এটি মূল কোডটি প্রদর্শন করে, তখন class Mসাধারণত প্রদর্শিত হয়, তবে \u202Eসেখান থেকে সমস্ত কিছুর প্রদর্শন ক্রমকে বিপরীত করে \u202D, যা সবকিছু আবার বিপরীত করে দেয়। (আনুষ্ঠানিকভাবে, \u202Dলাইন টার্মিনেটর থেকে শুরু করে সবকিছুই দুবার বিপরীত হয়, একবার কারণে \u202Dএবং একবারে বাক্যটি আবার একবারের সাথে বিপরীত হয় \u202E, এই কারণেই এই পাঠ্যটি শেষের পরিবর্তে লাইনের মাঝখানে প্রদর্শিত হয়)) পরের লাইনের দিকনির্দেশটি লাইন টার্মিনেটরের কারণে প্রথমটির স্বাধীনভাবে পরিচালিত হয়, তাই {'H','e','l','l','o',' ','W','o','r','l','d','!'});}}সাধারণত প্রদর্শিত হয়।

পূর্ণ (অত্যন্ত জটিল, কয়েক ডজন পৃষ্ঠাগুলি) জন্য ইউনিকোড দ্বি নির্দেশমূলক অ্যালগরিদম, ইউনিকোড স্ট্যান্ডার্ড অ্যাঙ্কেক্স # 9 দেখুন


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

এটি কি আগ্রহী হয়ে সি # তে একইভাবে কাজ করবে?
IanF1

14
@ আইয়ানএফ 1 এটি যে কোনও ভাষায় কাজ করবে যেখানে সংকলক / দোভাষী আরটিএল এবং এলটিআর অক্ষরকে হোয়াইটস্পেস হিসাবে গণ্য করে। তবে আপনি যদি নিজের ব্যক্তির কোডটি স্পর্শ করতে পরবর্তী ব্যক্তির বোধগম্যতাটিকে মোটামুটি মূল্য দেন তবে প্রোডাকশন কোডে কখনও এটি করবেন না , যা আপনি ভাল হতে পারেন।
wizzwizz4

2
অথবা, অন্য কথায়: "সর্বদা কোডটি এমনভাবে হয় যে আপনার কোডটি বজায় রাখার সমাপ্ত ব্যক্তি হিংস্র মনোবিজ্ঞানী যিনি জানেন আপনি কোথায় থাকেন" " , @ আইয়ানএফ 1। অথবা সম্ভবত: "সর্বদা কোডটি যেন আপনার কোডটি বজায় রাখে এমন ব্যক্তি স্ট্যাক ওভারফ্লোতে মূল লেখক হিসাবে আপনাকে নাম এবং লজ্জা দেবে" "
কোডি গ্রে

43

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

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

দ্রষ্টব্য 1: এই অ্যালগরিদমটি পাঠ্য সম্পাদক এবং ব্রাউজারগুলি একই সাথে একই সাথে LTR অক্ষর (ইংরেজি) এবং আরটিএল অক্ষর (যেমন আরবি, হিব্রু) উভয় অক্ষর প্রদর্শন করতে ব্যবহার করে - সুতরাং "দ্বি"-দিকনির্দেশক। আপনি ইউনিকোডের ওয়েবসাইটে বিডেরেশনাল অ্যালগোরিদম সম্পর্কে আরও পড়তে পারেন ।
দ্রষ্টব্য 2: এলআরও এবং আরএলওর সঠিক আচরণটি অ্যালগরিদমের ২.২ অনুচ্ছেদে সংজ্ঞায়িত হয়েছে ।


এ জাতীয় সামর্থ্যের উদ্দেশ্য কী?
ইউজিন শ।

6
আরবি এবং হিব্রুকে সঠিকভাবে রেন্ডার করার জন্য এই চরিত্রগুলির মাঝে মাঝে প্রয়োজন হয়। এই ভাষাগুলি ডান থেকে বামে পড়ে এবং লেখা হয় (আরটিএল), প্রথম অক্ষর যা পড়ে / লিখিত হয় ডান হাতের অংশে উপস্থিত হয় । আপনি এখানে আরও পড়তে পারেন ।
জেমস লসন

আরবি এবং হিব্রু অক্ষরগুলি স্বতন্ত্রভাবে আরটিএল, যদিও - তারা কোনও স্পষ্ট ওভাররাইড ছাড়াই আরটিএল উপস্থিত হবে এবং তারা এমনকি স্বয়ংক্রিয়ভাবে কাছাকাছি কিছু অন্যান্য চরিত্রের ক্রমকেও বিপরীত করবে বলে আমি মনে করি বেশিরভাগ বিরামচিহ্ন - তাই সুস্পষ্ট ওভাররাইডগুলি খুব কমই প্রয়োজন হয়।
ব্যবহারকারী 2357112 12:47

ওভাররাইডগুলি প্রয়োজনীয় হলে এখানে এই পৃষ্ঠাটি বর্ণনা করে। @ ব্যবহারকারী 2357112 ঠিক আছে, তাদের খুব কমই প্রয়োজন হয়। আসলে আপনার যখন বিরামচিহ্ন, উদ্ধৃতি এবং সংখ্যা থাকে - এই বিশেষ অক্ষরগুলিকে "নিরপেক্ষ" হিসাবে বিবেচনা করা হয়। যে কম্পিউটারটি শব্দগুলি পড়তে পারে না এবং প্রসঙ্গটি বুঝতে পারে না, তাদের কাছে এলটিআর বা আরটিএল হিসাবে বিবেচনা করা হবে কিনা তা স্পষ্ট নয়, তবে বিড়ি অ্যালগরিদমকে কিছু ক্রম বাছাই করতে হবে । কখনও কখনও এটি "এটি ভুল হয়ে যায়" এবং আপনাকে "এটি সংশোধন করতে" এই ওভাররাইড অক্ষরগুলি ব্যবহার করতে হবে।
জেমস লসন

3
এছাড়াও, U + 202E এবং U + 202D হোয়াইটস্পেস হিসাবে বিবেচনা করা হয় না। জাভা কেবল এএসসিআইআই স্পেস, অনুভূমিক ট্যাব, ফর্ম ফিড এবং সিআর / এলএফ / সিআরএলএফকে হোয়াইটস্পেস হিসাবে বিবেচনা করে । তারা আসলে শব্দের সাথে শনাক্তকারীদের একটি অংশ M\u202Eএবং a\u202Dতবে সেই শনাক্তকারীরা Mএবং এর সমতুল্য বলে মনে হয় a। (জেএলএস এটি ব্যাখ্যা করার জন্য ভাল কাজ করে না))
ব্যবহারকারী 2357112 মনিকা

28

চরিত্রটি U+202Eডান থেকে বামে কোডটি আয়না করে, যদিও এটি খুব চালাক। এম থেকে শুরু করে লুকানো আছে,

"class M\u202E{..."

আমি এর পিছনে যাদুটি কীভাবে পেলাম ?

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

একটু সম্পর্কে

ইউনিকোড দ্বিদশিত আলগোরিদম, এবং U+202Eজড়িত একটি সংক্ষিপ্তভাবে ব্যাখ্যা :

ইউনিকোড স্ট্যান্ডার্ড যৌক্তিক আদেশ হিসাবে পরিচিত একটি মেমরি প্রতিনিধিত্ব আদেশ নির্ধারণ করে। যখন পাঠ অনুভূমিক রেখায় উপস্থাপিত হয়, বেশিরভাগ স্ক্রিপ্টগুলি বাম থেকে ডানে অক্ষর প্রদর্শন করে। তবে কয়েকটি স্ক্রিপ্ট রয়েছে (যেমন আরবি বা হিব্রু) যেখানে ডাইর থেকে বাম দিকের অনুভূমিক পাঠ্যের প্রাকৃতিক ক্রম রয়েছে। যদি সমস্ত পাঠ্যের একটি অভিন্ন অনুভূমিক দিক থাকে, তবে প্রদর্শন পাঠ্যের ক্রমটি দ্ব্যর্থহীন।

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

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

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

কেন মত কিছু অ্যালগরিদম তৈরি এই ?

বিড়ি অ্যালগরিদম একের পর এক ডান থেকে বামে আরবি বা হিব্রু বর্ণের ক্রম রেন্ডার করতে পারে।


4

ভাষা স্পেসিফিকেশনের ৩ য় অধ্যায়টি জাভা প্রোগ্রামের জন্য কীভাবে লেজিক্যাল অনুবাদ করা হয় তা বিশদ বর্ণনা করে একটি ব্যাখ্যা সরবরাহ করে। প্রশ্নের জন্য সবচেয়ে গুরুত্বপূর্ণ কী:

প্রোগ্রামগুলি ইউনিকোডে (.13.1) লিখিত আছে , তবে লিকিক্যাল অনুবাদগুলি সরবরাহ করা হয় (§3.2) যাতে ইউনিকোড এস্কেপস (§3.3) কেবলমাত্র এএসসিআইআই অক্ষর ব্যবহার করে যে কোনও ইউনিকোড অক্ষর অন্তর্ভুক্ত করতে পারে।

সুতরাং একটি প্রোগ্রাম ইউনিকোড অক্ষরগুলিতে লেখা থাকে এবং \uxxxxফাইল এনকোডিংটি ইউনিকোড চরিত্রটিকে সমর্থন না করে এমন ক্ষেত্রে লেখক এগুলি ব্যবহার করে পালাতে পারেন , সেক্ষেত্রে এটি উপযুক্ত চরিত্রে অনুবাদ করা হয়েছে। এই ক্ষেত্রে উপস্থিত ইউনিকোডের একটি চরিত্র \u202E। এটি স্নিপেটে দৃশ্যত প্রদর্শিত হয় না, তবে আপনি যদি ব্রাউজারের এনকোডিংটি স্যুইচ করার চেষ্টা করেন তবে লুকানো অক্ষরগুলি উপস্থিত হতে পারে।

সুতরাং, ক্লাস ঘোষণায় লেজিক অনুবাদ ফলাফল:

class M\u202E{

যার অর্থ শ্রেণি শনাক্তকারী M\u202Eস্পেসিফিকেশন একটি বৈধ identifer হিসাবে এই বিবেচনা করে:

Identifier:
    IdentifierChars but not a Keyword or BooleanLiteral or NullLiteral
IdentifierChars:
    JavaLetter {JavaLetterOrDigit}

একটি "জাভা চিঠি-বা-অঙ্ক" একটি চরিত্র যার জন্য পদ্ধতিটি Character.isJavaIdentifierPart(int)সত্য ফিরে আসে।


দুঃখিত তবে এটি পশ্চাৎপদ (পাং উদ্দেশ্যে)। সোর্স কোডে কোনও পালানো নেই; আপনি কীভাবে এটি লেখা যেতে পারে তা বর্ণনা করছেন। এবং এটি "এম" (কেবল একটি চরিত্র) নামের একটি শ্রেণিতে সংকলন করে।
টম ব্লডজেট

@ টমব্লডজেট প্রকৃতপক্ষে তবে পয়েন্টটি (যা আসলে আমি অনুমানের উদ্ধৃতিতে হাইলাইট করেছি) হ'ল সংকলকটি কাঁচা ইউনিকোড অক্ষরগুলিও প্রক্রিয়া করতে পারে। সত্যিই এটি সম্পূর্ণ ব্যাখ্যা। পালানোর অনুবাদটি কেবলমাত্র একটি অতিরিক্ত তথ্য এবং সরাসরি এই মামলার সাথে সম্পর্কিত নয়। সংকলিত শ্রেণীর জন্য, আমি মনে করি কারণ এটি আরটিএল স্যুইচ অক্ষরটি কোনওভাবেই সংকলক দ্বারা বাতিল করা হচ্ছে। আমি এটির প্রত্যাশিত কিনা তা দেখার চেষ্টা করব, তবে আমি মনে করি লেজিক অনুবাদ পর্বের পরে এটি ঘটবে।
এম অনুতি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.