কেন 2+ 40 সমান 42?


360

যখন কোনও সহকর্মী আমাকে জাভাস্ক্রিপ্টের 42 টি সতর্কতা অবলম্বন করে দেখান তখন আমি হতবাক হয়ে যাই।

alert(2+ 40);

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

এই বিষয়টি ভাবতে পেরেছিলাম যে অভিব্যক্তিটি বিশ্লেষণ করার পরে সেই চরিত্রটি কেন সিনট্যাক্স ত্রুটি তৈরি করে না। আরও আরও চরিত্রগুলি এর সাথে আচরণ করে কিনা তাও আমি জানতে চাই।


28
@ এলিয়াসিন আপনি কি অনুলিপি / পেস্ট করেছেন বা টাইপ করেছেন?
ব্যবহারকারী 253751

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

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

58
(ওটি) কারণ 42 কি সবকিছুর
ivan_pozdeev

4
@ থমাস যে ইউনিকোড চরিত্রটির কারণে অপ্রত্যাশিত ফলাফলের কারণ হয়েছে তা ইতিমধ্যে পরিষ্কার ছিল।
0

উত্তর:


470

সেই চরিত্রটি হ'ল "ওঘাম স্পেস মার্ক" , যা একটি স্থানের অক্ষর। সুতরাং কোড সমান alert(2+ 40)

আরও আরও চরিত্রগুলি এর সাথে আচরণ করে কিনা তাও আমি জানতে চাই।

জেডএস ক্লাসের যে কোনও ইউনিকোড অক্ষর জাভাস্ক্রিপ্টে একটি সাদা স্থানের অক্ষর , তবে এমনটি মনে হয় না

যাইহোক, জাভাস্ক্রিপ্ট সনাক্তকারীগুলিতে ইউনিকোড অক্ষরগুলিকেও মঞ্জুরি দেয় , যা আপনাকে আকর্ষণীয় পরিবর্তনশীল নামগুলির মতো ব্যবহার করতে দেয় ಠ_ಠ


3
একটি-হেক্স-কোড সহ-বক্স-সহ-হেক্স-কোড-সহ-বাক্স box কোন চরিত্রটি বোঝাতে চাইছে?
ব্যবহারকারী 253751

12
@ ইমিবিস এই উত্তরের শেষ অংশটি ইমোগোনটি যা ইমেজর আকারে অস্বীকৃতিতে
মার্ক এস।

3
নোট করুন যে Zsজাভাস্ক্রিপ্টে কেবল অক্ষরকেই সাদা স্থান হিসাবে বিবেচনা করা হয় না। আরও রয়েছে: github.com/mathiasbynens/regexpu/blob/…
ম্যাথিয়াস বাইনেস

20
আমার প্রতিক্রিয়া যখন ಠ_ಠজেএস এ সনাক্তকারী হিসাবে ব্যবহার করা যেতে পারে: ಠ_ಠ
ক্রিস কেরিফাইস

2
@ ক্রিসক্রাইফাইসকে চিঠি হিসাবে বিবেচনা করা হচ্ছে সি-স্টাইলের ল্যাঙ্গোজে দীর্ঘস্থায়ী। একটি চিঠি হিসাবে বিবেচনা করা সাধারণ ধারণা, কারণ এটি একটি চিঠি। এটি ಠ_ಠসনাক্তকারী হিসাবে ব্যবহার না করতে পারলে এটি একটি স্পষ্ট বাগ হবে।
জন হান্না

81

অন্যান্য উত্তরগুলি পড়ার পরে, আমি সাদা স্পেসগুলির মতো আচরণ করে এমন U + 0000 – U + FFFF পরিসরের সমস্ত ইউনিকোড অক্ষর সন্ধান করার জন্য একটি সাধারণ স্ক্রিপ্ট লিখেছিলাম। যেমনটি মনে হচ্ছে, ব্রাউজারের উপর নির্ভর করে তাদের মধ্যে 26 বা 27 টি রয়েছে ইউ + 0085 এবং ইউ + এফএফএফ সম্পর্কে মতানৈক্য সহ।

নোট করুন যে এই অক্ষরগুলির বেশিরভাগটি কেবল নিয়মিত সাদা জায়গার মতো দেখায়।


17
ইউ + 0085 "এনইএল" ইউনিকোড দ্বারা হোয়াইটস্পেস হিসাবে সংজ্ঞায়িত করা হয়েছে তবে ভুলভাবে ছাঁটাই হওয়ার দীর্ঘ ইতিহাস রয়েছে। ইউ + এফএফএফ হ'ল একটি ননচার্যাকার যার নাম নেই এবং এন সিআর ছাড়াও কোনও বৈশিষ্ট্য নেই এবং যুক্তিসঙ্গত কোনও জিনিস দ্বারা হোয়াইটস্পেস হিসাবে বিবেচনা করা উচিত নয়। এটি বলেছিল, আমার ব্রাউজার উভয় পয়েন্টে আমার সাথে একমত নয় :)
হবিস

4
@ হবস ইউ + এফএফএফই \p{Default Ignorable Code Point}কেবল একটি নয় \p{Noncharacter Code Pount}। U + 0085 সর্বদা একটি \p{Whitespace}কোড পয়েন্ট হয়ে থাকে। দুষ্টটি হ'ল U + 180E মঙ্গোলিয়ান স্বর বিভাজন, যা "সম্প্রতি" \p{Whitespace}সম্পত্তি হারিয়েছে । নোট যেটি \p{Pattern Whitespace}অনেক ছোট সেট, এবং একটি পরিবর্তনযোগ্য সম্পত্তি। তবে \p{Whitespace}হয় না।
tchrist

2
FEFFএটি বিওএম এবং পাঠ্যগুলির মধ্যে "শূন্য প্রস্থের নন-ব্রেক স্পেস" এর মতো আচরণ করা যেতে পারে। FFFEএটি এরিয়ান সমতুল্য। সম্ভবত কিছু ব্রাউজার হ'ল স্পেস হিসাবে বিবেচনা করে।
কোডসইনচওস

ecma-international.org/ecma-262/6.0/#sec- white-space (যেমনটি ফেলিক্স কিংয়ের উত্তর থেকে লিঙ্কিত ) বিশেষত জেএস উত্স কোডে ইউ + এফএফএফকে হোয়াইটস্পেস হিসাবে বিবেচনা করার আহ্বান জানিয়েছে। U + FFFE তালিকাভুক্ত নয়, তবে এটি আমাকে বাদ দেওয়ার ত্রুটি হিসাবে আঘাত করে strikes
zwol

1
@ zwol, এটি বাদ দেওয়ার ত্রুটি নয়, কারণ ইউ + এফএফএফ কোনও অক্ষর নেই। হোয়াইটস্পেস হিসাবে এর ব্যবহার করা একটি বাগ is প্রকৃতপক্ষে, একে একে বৈধ চরিত্র হিসাবে বিবেচনা করা বেশিরভাগ ক্ষেত্রেই একটি বাগ। ইউ + 0085 জেএস স্পট অনুযায়ী সাদা স্থান নয়, তবে সেই স্পপের জন্য নতুন লাইন না হওয়ার জন্য ইউ + 0085 এর বিশেষ প্রচ্ছদ প্রয়োজন উদ্ভট এবং তর্কিতভাবে ত্রুটিযুক্ত একটি বাগ is
জন হান্না

56

দেখা যাচ্ছে যে আপনি যে চরিত্রটি ব্যবহার করছেন তা প্রকৃত বিয়োগ চিহ্ন (হাইফেন) এর চেয়ে দীর্ঘ longer

 
-

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

আপনি যে চরিত্রটি ব্যবহার করেন তা হ'ল ওঘাম স্পেস চিহ্ন যা একটি শ্বেতস্থান চরিত্র, তাই এটি মূলত স্থান হিসাবে একই জিনিস হিসাবে ব্যাখ্যা করা হয় যার অর্থ আপনার বক্তব্য alert(2+ 40)জাভাস্ক্রিপ্টের মতো দেখাচ্ছে ।

জাভাস্ক্রিপ্টে এর মতো অন্যান্য চরিত্র রয়েছে। আপনি এখানে উইকিপিডিয়ায় একটি সম্পূর্ণ তালিকা দেখতে পাবেন ।


এই চরিত্রটি সম্পর্কে আমি আকর্ষণীয় কিছু লক্ষ্য করেছি যে গুগল ক্রোম (এবং সম্ভাব্য অন্যান্য ব্রাউজারগুলি) পৃষ্ঠার উপরের বারে এটি ব্যাখ্যা করে।

এখানে চিত্র বর্ণনা লিখুন

এটি এর 1680ভিতরে একটি ব্লক । ওঘাম স্পেস চিহ্নের জন্য এটি আসলে ইউনিকোড নম্বর। এটি কেবল আমার মেশিনটি এটি করছে বলে মনে হয় তবে এটি একটি আশ্চর্যের বিষয়।


কী হয় তা দেখার জন্য আমি অন্যান্য ভাষায় এটি চেষ্টা করার সিদ্ধান্ত নিয়েছি এবং এগুলি আমার প্রাপ্ত ফলাফল।


যে ভাষাগুলিতে এটি কাজ করে না:

পাইথন 2 এবং 3

>> 2+ 40
  File "<stdin>", line 1
    2+ 40
        ^
SyntaxError: invalid character in identifier

চুনি

>> 2+ 40
NameError: undefined local variable or method ` 40' for main:Object
    from (irb):1
    from /home/michaelpri/.rbenv/versions/2.2.2/bin/irb:11:in `<main>'

জাভা ( mainপদ্ধতির ভিতরে )

>> System.out.println(2+ 40);
Main.java:3: error: illegal character: \5760
            System.out.println(2+?40);
                                 ^
Main.java:3: error: ';' expected
            System.out.println(2+?40);
                                  ^
Main.java:3: error: illegal start of expression
            System.out.println(2+?40);
                                    ^
3 errors

পিএইচপি

>> 2+ 40;
Use of undefined constant  40 - assumed ' 40' :1

সি

>> 2+ 40
main.c:1:1: error: expected identifier or '(' before numeric constant
 2+ 40
 ^
main.c:1:1: error: stray '\341' in program
main.c:1:1: error: stray '\232' in program
main.c:1:1: error: stray '\200' in program

exit status 1

যাওয়া

>> 2+ 40
can't load package: package .: 
main.go:1:1: expected 'package', found 'INT' 2
main.go:1:3: illegal character U+1680

exit status 1

পার্ল 5

>> perl -e'2+ 40'                                                                                                                                   
Unrecognized character \xE1; marked by <-- HERE after 2+<-- HERE near column 3 at -e line 1.

এটি যে ভাষাগুলিতে কাজ করে:

পরিকল্পনা

>> (+ 240)
=> 42

সি # ( Main()পদ্ধতির অভ্যন্তরে)

Console.WriteLine(2+ 40);

Output: 42

পার্ল 6

>> ./perl6 -e'say 2+ 40' 
42

34
উবুন্টু সমস্যা নয়। আপনি যে উইন্ডো শিরোনাম হরফ ব্যবহার করছেন তা হ'ল।
পিএসকোকিক

2
ডেবিয়ানের ফায়ারফক্স (আইসওয়েজেল) এবং গুগল ক্রোম ইউনিকোড চরটি ঠিকঠাক প্রদর্শন করবে বলে মনে হচ্ছে, যদিও আমি আমার সিস্টেমে ইউনিকোডের সামঞ্জস্যতা নিশ্চিত করার জন্য লম্বা হয়েছি। (আসলে, আমি সবচেয়ে কার্যকর জিনিসটি সবচেয়ে সহজ কাজটি করেছিলেন: sudo apt-get install unicodeযদিও কয়েক ঘন্টা গবেষণা এবং ব্যর্থ চেষ্টার পরে)
sig_seg_v

@ স্পোকিক আকর্ষণীয়, আমার এখানে আগে ফন্টের সমস্যা ছিল, তাই সম্ভবত এটি সম্ভবত
মাইকেলেল

51
@ পিস্কোকিক "উবুন্টু সমস্যা নয়। আপনি যে উইন্ডো শিরোনাম ফন্টটি ব্যবহার করছেন তা হ'ল। … যা “ উবুন্টু ”।
ব্যবহারকারী4642212

1
@ স্পস্কিক আমি শেষ পর্যন্ত এটি ঠিক করে ফেলেছি: সিস্টেম শিরোনাম বারের ফন্টটি পরিবর্তন করার দরকার ছিল।
মাইকেলেলপ্রি

43

আমি অনুমান করি যে এটির সাথে কিছুটা করতে হবে যে কিছু অদ্ভুত কারণে এটি হোয়াইটস্পেস হিসাবে শ্রেণিবদ্ধ করে:

$ unicode  
U+1680 OGHAM SPACE MARK
UTF-8: e1 9a 80  UTF-16BE: 1680  Decimal: &#5760;( )
Uppercase: U+1680
Category: Zs (Separator, Space)
Bidi: WS (Whitespace)

যদি এটি আপনার টার্মিনাল থেকে অনুলিপি করে আটকানো হয় তবে আমি জানতে চাই আপনি কমান্ডটি কোথায় পেয়েছেন unicode
বেনজিউইবি

16
এটি unicodeরাবুভান গারাবাকের উবুন্টু প্যাকেজটির (এটির জন্য অপেক্ষা করুন ...) থেকে । সংশ্লিষ্ট রেপোটি github.com/garabik/unicodeরয়েছে
পিএসকোকিক

ঠিক আছে, গিথুব লিঙ্কের জন্য ধন্যবাদ। আফিক্স, এটি ফেডোরা ভান্ডারে নেই।
বেনজিউইবি

@PSkocik ' '.codePointAt(0)কনসোল 5760. সমর্পণ করা হবে এখন 5760 ইউনিকোড google।
রই নমির

6

আরও আরও চরিত্রগুলি এর সাথে আচরণ করে কিনা তাও আমি জানতে চাই।

আমি মনে করি মনে হয় কারও কোডে আধা-কলোনগুলি (ইউ + 003 বি) প্রতিস্থাপনের বিষয়ে ইউ + 037 ই এর পরিবর্তে কিছুক্ষণ আগে একটি টুকরো পড়েছিলাম যা গ্রীক প্রশ্ন চিহ্ন।

তারা উভয়ই দেখতে একরকম (আমি বিশ্বাস করি যে গ্রীকরা নিজেরাই ইউ + 003 বি ব্যবহার করে) তবে এই নিবন্ধটি বলেছিল যে অন্যটি কাজ করবে না।

উইকিপিডিয়া থেকে এই সম্পর্কে আরও কিছু তথ্য এখানে: https://en.wikedia.org/wiki/Question_mark# গ্রিক_উইকশন_মার্ক

এবং এটিকে নিজে থেকে প্রংক হিসাবে ব্যবহার করার বিষয়ে একটি (বদ্ধ) প্রশ্ন। আমি যেখানে এটি মূলত AFAIR পড়ি তা নয়: জাভাস্ক্রিপ্ট প্র্যাঙ্ক / জোক

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