java - यह कोड, पीछे की ओर लिखा हुआ, "हैलो वर्ल्ड!"




unicode right-to-left (3)

कैरेक्टर U+202E कोड को दाएं से बाएं ओर U+202E , हालांकि यह बहुत चालाक है। M में छिपा हुआ है,

"class M\u202E{..."

मैंने इसके पीछे जादू कैसे पाया?

ठीक है, पहली बार में जब मैंने सवाल देखा कि मैं सख्त हूं, "यह एक तरह का मजाक है, किसी और को खोने के लिए", लेकिन फिर, मैंने अपना आईडीई ("इंटेलीज") खोला, एक वर्ग बनाया, और कोड को पिछले ... और यह संकलित !!! इसलिए, मैंने एक बेहतर रूप लिया और देखा कि "सार्वजनिक स्थैतिक शून्य" पिछड़ा हुआ था, इसलिए मैं कर्सर के साथ वहां गया, और कुछ वर्ण मिटा दिए ... और क्या होता है? वर्ण पीछे हटने लगे , इसलिए, मैंने सोचा कि एमएमएम .... दुर्लभ ... मुझे इसे निष्पादित करना होगा ... इसलिए मैं कार्यक्रम को निष्पादित करने के लिए आगे बढ़ता हूं, लेकिन पहले मुझे इसे बचाने की जरूरत थी ... और वह तब था जब मैं मिल गया! । मैं फ़ाइल को सहेज नहीं सका क्योंकि मेरी आईडीई ने कहा कि कुछ चार के लिए एक अलग एन्कोडिंग था, और मुझे इंगित करें कि वह कहाँ था , इसलिए मैं विशेष चार्ट के लिए Google में एक शोध शुरू करता हूं जो काम कर सकता है, और यह है :)

थोड़ा सा

यूनिकोड द्विदिश एल्गोरिथ्म, और U+202E शामिल, संक्षेप में व्याख्या :

यूनिकोड स्टैंडर्ड एक मेमोरी प्रतिनिधित्व आदेश को तार्किक क्रम के रूप में जाना जाता है। जब पाठ क्षैतिज रेखाओं में प्रस्तुत किया जाता है, तो अधिकांश स्क्रिप्ट बाएं से दाएं वर्ण प्रदर्शित करती हैं। हालाँकि, कई लिपियाँ हैं (जैसे कि अरबी या हिब्रू) जहाँ प्रदर्शन में क्षैतिज पाठ का प्राकृतिक क्रम दाएँ से बाएँ होता है। यदि सभी पाठ में एक समान क्षैतिज दिशा है, तो प्रदर्शन पाठ का क्रम अस्पष्ट है।

हालाँकि, क्योंकि ये दाएँ-से-बाएँ स्क्रिप्ट अंकों का उपयोग करते हैं जो बाएँ से दाएँ लिखे जाते हैं, पाठ वास्तव में द्वि-दिशात्मक होता है: दाएँ से बाएँ और बाएँ से दाएँ पाठ का मिश्रण। अंकों के अलावा, अंग्रेजी और अन्य लिपियों से एम्बेडेड शब्द भी बाएं से दाएं लिखे जाते हैं, साथ ही द्विदिश पाठ का उत्पादन भी करते हैं। स्पष्ट विनिर्देश के बिना, अस्पष्टता प्रदर्शित वर्णों के क्रम को निर्धारित करने में उत्पन्न हो सकती है जब पाठ की क्षैतिज दिशा एक समान नहीं होती है।

यह अनुलग्नक द्विदिश यूनिकोड पाठ के लिए दिशा निर्धारित करने के लिए उपयोग किए गए एल्गोरिदम का वर्णन करता है। एल्गोरिथ्म वर्तमान में कई मौजूदा कार्यान्वयनों द्वारा नियोजित निहित मॉडल का विस्तार करता है और विशेष परिस्थितियों के लिए स्पष्ट स्वरूपण वर्ण जोड़ता है। ज्यादातर मामलों में, सही प्रदर्शन आदेश प्राप्त करने के लिए पाठ के साथ अतिरिक्त जानकारी शामिल करने की आवश्यकता नहीं है।

हालाँकि, बिडायरेक्शनल टेक्स्ट के मामले में, ऐसी परिस्थितियाँ होती हैं, जिसमें एक अनुमानित बिडायरेक्शनल ऑर्डर कंप्रीहेंसिव टेक्स्ट का उत्पादन करने के लिए पर्याप्त नहीं होता है। इन मामलों से निपटने के लिए, जब प्रस्तुत किया जाता है तो पात्रों के क्रम को नियंत्रित करने के लिए दिशात्मक स्वरूपण वर्णों का एक न्यूनतम सेट परिभाषित किया जाता है। यह सुपाच्य इंटरचेंज के लिए डिस्प्ले ऑर्डरिंग के सटीक नियंत्रण की अनुमति देता है और यह सुनिश्चित करता है कि फ़ाइलनाम या लेबल जैसी सरल वस्तुओं के लिए उपयोग किए जाने वाले सादे पाठ को हमेशा प्रदर्शन के लिए सही ढंग से ऑर्डर किया जा सकता है।

website तरह से कुछ एल्गोरिथ्म क्यों बनाएं?

बीड़ी एल्गोरिथ्म एक के बाद एक अरबी या हिब्रू वर्णों के अनुक्रम को दाएं से बाएं कर सकता है।

पुनश्च: मुझे पता है कि यह सबसे अच्छा जवाब नहीं है, लेकिन पहले इस समस्या को हल करने के लिए मजेदार था: पी

यहाँ कुछ कोड है जो मुझे इंटरनेट पर मिले हैं:

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! प्रिंट करता है Hello World! स्क्रीन पर; आप इसे here चला सकते हैं। मैं स्पष्ट रूप से public static void main लिखित देख सकता हूं, लेकिन यह पीछे की ओर है। यह कोड कैसे काम करता है? यह कैसे भी संकलित करता है?

संपादित करें: मैंने IntellIJ में इस कोड की कोशिश की, और यह ठीक काम करता है। हालांकि, किसी कारण से यह cmd के साथ, notepad ++ में काम नहीं करता है। मुझे अभी भी इसका कोई हल नहीं मिला है, इसलिए यदि कोई करता है, तो नीचे टिप्पणी करें।


यहां अदृश्य अक्षर हैं जो कोड को प्रदर्शित करने के तरीके को बदलते हैं। Intellij में इन्हें कोड को एक रिक्त स्ट्रिंग ( "" ) में कॉपी-पेस्ट करके पाया जा सकता है, जो उन्हें यूनिकोड से बचाता है, उनके प्रभाव को हटाता है और संकलक के आदेश को प्रकट करता है।

यहाँ उस कॉपी-पेस्ट का आउटपुट दिया गया है:

"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 कारण उल्टा हो जाता है, यही कारण है कि यह पाठ लाइन के बीच में दिखाई देता है अंत के बजाय।) अगली पंक्ति की दिशात्मकता को पहली बार लाइन टर्मिनेटर के कारण स्वतंत्र रूप से नियंत्रित किया जाता है, इसलिए {'H','e','l','l','o',' ','W','o','r','l','d','!'});}} को सामान्य रूप से प्रदर्शित किया जाता है।

पूर्ण (अत्यंत जटिल, दर्जनों पृष्ठों लंबा) यूनिकोड द्विदिश एल्गोरिथ्म के लिए, यूनिकोड मानक अनुलग्नक # 9 देखें


भाषा विनिर्देश के अध्याय 3 में एक जावा कार्यक्रम के लिए शाब्दिक अनुवाद कैसे किया जाता है, इसके बारे में विस्तार से वर्णन करके एक विवरण प्रदान करता है। सवाल के लिए क्या मायने रखता है:

कार्यक्रम यूनिकोड (§3.1) में लिखे गए हैं , लेकिन लेक्सिकल अनुवाद प्रदान किए गए हैं (.23.2) ताकि यूनिकोड बच (ic3.3) का उपयोग केवल ASCII वर्णों का उपयोग करके किसी भी यूनिकोड वर्ण को शामिल करने के लिए किया जा सके।

तो एक प्रोग्राम यूनिकोड वर्णों में लिखा गया है, और फ़ाइल \uxxxx यूनिकोड वर्ण का समर्थन नहीं करने की स्थिति में लेखक उन्हें बचा सकता है, इस मामले में यह उपयुक्त वर्ण में अनुवादित है। इस मामले में मौजूद यूनिकोड वर्णों में से एक \u202E । यह स्निपेट में नेत्रहीन नहीं दिखाया गया है, लेकिन यदि आप ब्राउज़र के एन्कोडिंग को स्विच करने का प्रयास करते हैं, तो छिपे हुए अक्षर दिखाई दे सकते हैं।

इसलिए, शाब्दिक अनुवाद कक्षा घोषणा में परिणाम करता है:

class M\u202E{

जिसका अर्थ है कि वर्ग पहचानकर्ता M\u202Especification इसे एक वैध पहचानकर्ता मानता है:

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

एक "जावा पत्र-या-अंक" एक चरित्र है जिसके लिए Character.isJavaIdentifierPart(int) सही है।







right-to-left