2 + 40 बराबर 42 क्यों होता है?


360

मैं चकित था जब एक सहकर्मी ने मुझे जावास्क्रिप्ट की 42 की यह लाइन दिखाई।

alert(2+ 40);

यह जल्दी से पता चलता है कि क्या एक माइनस साइन की तरह दिखता है वास्तव में एक स्पष्ट रूप से अलग शब्दार्थ के साथ एक यूनिकोड चरित्र है।

इसने मुझे आश्चर्यचकित कर दिया कि जब अभिव्यक्ति पार्स की जाती है तो वह वर्ण वाक्यविन्यास त्रुटि क्यों उत्पन्न नहीं करता है। मैं यह भी जानना चाहूंगा कि क्या इस तरह के व्यवहार वाले और भी चरित्र हैं।


28
@Elyasin क्या आपने कॉपी / पेस्ट या रीस्क्रिप्ट किया?
user253751

4
यह विजुअल C # में भी काम करता है। विजुअल स्टूडियो आईडीई में अजीब चरित्र को पेस्ट करते समय, या टाइप करके स्टेटमेंट को पूरा करते समय ;, संपादक अजीब `` चरित्र को एक सामान्य स्थान में बदलने के लिए जाता है, लेकिन यदि आप "ऑटो-करेक्शन" को पूर्ववत करते हैं, तो आपके पास एक ही व्यवहार है । उस चरित्र में एक स्थान के समान शब्दार्थ होता है, भले ही वह हाइफ़न या माइनस (सामान्य फोंट में) जैसा दिखता हो।
जेपी स्टिग नील्सन

4
विपरीत भी हो सकता है। पहचानकर्ताओं में यूनिकोड का समर्थन करने वाली कुछ भाषाएं यूनिकोड वर्णों को स्वीकार करती हैं जो सफेद स्थान की तरह दिखते हैं (दूसरे शब्दों में, आप उन्हें नहीं देख सकते हैं); यह पूरी तरह से अदृश्य पहचानकर्ताओं के लिए भी संभव हो सकता है।
gnasher729

58
(ओटी) क्योंकि 42 हर चीज का
ivan_pozdeev

4
@ थोमस इस तथ्य के अनपेक्षित परिणाम के कारण था कि यूनिकोड चरित्र पहले से ही स्पष्ट था।
गोटो 0

जवाबों:


470

वह चरित्र "ओगहैम स्पेस मार्क" है , जो एक अंतरिक्ष चरित्र है। तो कोड के बराबर है alert(2+ 40)

मैं यह भी जानना चाहूंगा कि क्या इस तरह के व्यवहार वाले और भी चरित्र हैं।

Zs वर्ग में कोई भी यूनिकोड वर्ण जावास्क्रिप्ट में एक श्वेत स्थान वर्ण है , लेकिन ऐसा नहीं लगता है

हालाँकि, जावास्क्रिप्ट पहचानकर्ताओं में यूनिकोड वर्णों को भी अनुमति देता है , जो आपको दिलचस्प चर नामों का उपयोग करने देता है ಠ_ಠ


3
बॉक्स-ए-हेक्स-कोड अंडरस्कोर बॉक्स-ए-हेक्स-कोड के साथ। यह कौन सा चरित्र है?
user253751

12
@immibis इस उत्तर के अंतिम भाग किसी भी इमोटिकॉन छवि के रूप में उपलब्ध है disapprovallook.com
मार्क एस

3
ध्यान दें कि Zsजावास्क्रिप्ट में न केवल वर्णों को सफेद स्थान माना जाता है। और भी हैं: github.com/mathiasbynens/regexpu/blob/…
Mathias Bynens

20
मेरे प्रतिक्रिया जब ಠ_ಠजे एस में एक पहचानकर्ता के रूप में इस्तेमाल किया जा सकता: ಠ_ಠ
क्रिस Cirefice

2
@ChrisCirefice अंडरस्कोर को एक पत्र के रूप में माना जा रहा है जो लंबे समय से सी-स्टाइल लहंगा में है। एक पत्र के रूप में व्यवहार किया जा रहा है, यह सिर्फ एक सामान्य ज्ञान है, क्योंकि यह एक पत्र है। यदि ಠ_ಠयह एक पहचानकर्ता के रूप में इस्तेमाल नहीं किया जा सकता है तो यह एक स्पष्ट बग होगा ।
जॉन हैना

81

अन्य उत्तरों को पढ़ने के बाद, मैंने सभी यूनिकोड वर्णों को खोजने के लिए एक सरल स्क्रिप्ट लिखी जिसमें U + 0000 – U + FFFF है जो श्वेत स्थानों की तरह व्यवहार करता है। जैसा कि लगता है, उनमें से 26 या 27 ब्राउज़र पर निर्भर करते हैं, U + 0085 और U + FFFE के बारे में असहमति के साथ।

ध्यान दें कि इनमें से अधिकांश अक्षर सिर्फ एक नियमित सफेद स्थान की तरह दिखते हैं।


17
यू + 0085 "एनईएल" को यूनिकोड द्वारा व्हाट्सएप के रूप में परिभाषित किया गया है लेकिन इसका गलत इतिहास है। U + FFFE एक गैर-लाभार्थी है जिसमें NChar के अलावा कोई नाम और कोई गुण नहीं है और इसे कुछ भी उचित नहीं माना जाना चाहिए। जिसके अनुसार, दोनों अंक :) पर मेरे साथ अपने ब्राउज़र असहमत
हॉब्स

4
@hobbs U + FFFE भी एक है \p{Default Ignorable Code Point}, न कि सिर्फ एक \p{Noncharacter Code Pount}। U + 0085 हमेशा एक \p{Whitespace}कोड बिंदु रहा है। बुराई एक U + 180E मंगोलियाई VOWEL SEPARATOR है, जिसने "हाल ही में" अपनी \p{Whitespace}संपत्ति खो दी है। ध्यान दें कि \p{Pattern Whitespace}बहुत छोटा सेट है, और एक अपरिवर्तनीय संपत्ति है। लेकिन \p{Whitespace}नहीं है।
tchrist

2
FEFFबीओएम है और इसे ग्रंथों के भीतर "शून्य चौड़ाई नो-ब्रेक स्पेस" की तरह माना जा सकता है। FFFEक्या यह एंडियन स्वैप के बराबर है। शायद यही कारण है कि कुछ ब्राउज़रों का इलाज व्हाट्सएप के रूप में है।
कोडइन्चोस

ecma-international.org/ecma-262/6.0/#sec-white-space (जैसा कि फेलिक्स किंग के जवाब से जुड़ा हुआ है) विशेष रूप से जे + स्रोत कोड में व्हाट्सएप माना जाने वाला यू + फीफ कहता है। U + FFFE सूचीबद्ध नहीं है, लेकिन यह मुझे चूक की त्रुटि के रूप में प्रभावित करता है।
ज़ूल

1
@zwol, यह चूक की त्रुटि नहीं है, क्योंकि कोई वर्ण U + FFFE नहीं है। इसे व्हाट्सएप के रूप में मानना ​​एक बग है। वास्तव में, इसे एक वैध चरित्र के रूप में मानना ​​ज्यादातर मामलों में एक बग है। U + 0085, जेएस स्पेक्ट्रा के अनुसार सफेद जगह नहीं है, लेकिन यह कल्पना की विशेष लाइनिंग U + 0085 की नई लाइन नहीं होने के लिए विचित्र और यकीनन बग में एक बग है।
जॉन हैना

56

ऐसा प्रतीत होता है कि आप जिस चरित्र का उपयोग कर रहे हैं वह वास्तव में वास्तविक ऋण चिन्ह (एक हाइफ़न) की तुलना में अधिक लंबा है।

 
-

शीर्ष वह है जो आप उपयोग कर रहे हैं, नीचे वह है जो माइनस साइन होना चाहिए। आपको लगता है कि पहले से ही पता है, तो अब देखते हैं कि जावास्क्रिप्ट ऐसा क्यों करता है।

आप जिस चरित्र का उपयोग करते हैं, वह वास्तव में ओगैम स्पेस मार्क है, जो एक व्हाट्सएप चरित्र है, इसलिए इसे मूल रूप से अंतरिक्ष के रूप में एक ही चीज़ के रूप में व्याख्या किया जाता है, जिसका अर्थ है कि आपका कथन जैसा दिखता हैalert(2+ 40) जावास्क्रिप्ट है।

जावास्क्रिप्ट में इस तरह के अन्य वर्ण हैं। आप विकिपीडिया पर पूरी सूची यहाँ देख सकते हैं ।


इस चरित्र के बारे में कुछ दिलचस्प जो मैंने देखा है वह यह है कि Google Chrome (और संभव अन्य ब्राउज़र) पृष्ठ के शीर्ष बार में इसकी व्याख्या करता है।

यहां छवि विवरण दर्ज करें

यह इसके 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

पर्ल ५

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

भाषाएं जो इसमें काम करती हैं:

योजना

>> (+ 240)
=> 42

C # ( Main()विधि के अंदर )

Console.WriteLine(2+ 40);

Output: 42

पर्ल 6

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

34
उबंटू समस्या नहीं है। आपके द्वारा उपयोग किया जा रहा विंडो शीर्षक फ़ॉन्ट है।
PSkocik

2
firefox (iceweasel) और डेबियन पर गूगल क्रोम यूनिकोड चार को ठीक प्रदर्शित करता है, हालाँकि मैं अपने सिस्टम पर यूनिकोड अनुकूलता सुनिश्चित करने के लिए लंबाई तक गया हूँ। (वास्तव में, मैंने जो सबसे उपयोगी काम किया वह सबसे सरल था: sudo apt-get install unicodeहालाँकि केवल घंटों के शोध और असफल प्रयासों के बाद)
sig_seg_v

@PSkocik दिलचस्प है, मुझे पहले भी यहाँ पर फॉन्ट की समस्या रही है, इसलिए संभवत: यह संभव है
michaelpri

51
@PSkocik "Ubuntu समस्या नहीं है। आपके द्वारा उपयोग किया जा रहा विंडो शीर्षक फ़ॉन्ट है। " ... जो " उबंटू " है।
user4642212

1
@PSkocik I ने अंततः इसे ठीक कर दिया :) सिस्टम शीर्षक बार फ़ॉन्ट बदलने के लिए बस जरूरत है।
अक्टूबर को माइकलपल्ली

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
यह unicodeRadovan Garabík द्वारा नामित Ubuntu पैकेज (इसके लिए प्रतीक्षा करें ...) से है। संबंधित रिपो github.com/garabik/unicode पर है
PSkocik

ठीक है, जीथब लिंक के लिए धन्यवाद। AFAICT, यह फेडोरा रिपोज में नहीं है।
बेनजीवेब जुले

@PSkocik ' '.codePointAt(0)सांत्वना 5760. निकलेगा पर अब 5760 यूनिकोड गूगल।
रॉय नमिर

6

मैं यह भी जानना चाहूंगा कि क्या इस तरह के व्यवहार वाले और भी चरित्र हैं।

मुझे याद है कि कुछ समय पहले यू-037 ई के साथ किसी के कोड में अर्ध-कॉलोन (यू + 003 बी) को बदलने के बारे में एक टुकड़ा पढ़ना याद था जो कि ग्रीक प्रश्न चिह्न है।

वे दोनों एक ही दिखते हैं (इस हद तक कि मुझे विश्वास है कि यूनानी स्वयं U + 003B का उपयोग करते हैं) लेकिन इस लेख में कहा गया है कि दूसरा काम करेगा।

विकिपीडिया से इस बारे में कुछ और जानकारी यहाँ है: https://en.wikipedia.org/wiki/Question_mark#Greek_question_mark

और एसओ से ही प्रैंक के रूप में इसके इस्तेमाल पर (बंद) सवाल। नहीं, जहां मैंने मूल रूप से इसे AFAIR पढ़ा है: जावास्क्रिप्ट प्रैंक / जोक

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.