यह चरित्र क्या है: '*'?


48

एक मित्र ने एक सुस्त चैट रूम में एक कमांड चिपकाई, जिसमें चरित्र था *। यह एक सामान्य जैसा दिखता है, *लेकिन ऐसा नहीं है:

$ uniprops '*​'
uniprops: no character named ‹*​›

यदि मैं unipropsअपने मशीन पर टाइप करते समय तारांकन पर चलता हूं, तो मुझे मिलता है:

$ uniprops '*'
U+002A ‹*› \N{ASTERISK}
    \pP \p{Po}
    All Any ASCII Assigned Basic_Latin Punct Is_Punctuation Common Zyyy Po P
       Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase Other_Punctuation
       Pat_Syn Pattern_Syntax PatSyn POSIX_Graph POSIX_Print POSIX_Punct Print
       X_POSIX_Print Punctuation Unicode X_POSIX_Punct

मैं यह भी देख सकता हूं कि यह एक वास्तविक तारांकन नहीं है जो इसे गुजरता है od:

$ printf '*​' | od -c
0000000   * 342 200 213
0000004

जबकि सामान्य देता है:

$ printf '*' | od -c
0000000   *
0000001

यहाँ रहस्य चरित्र थोड़ा बड़ा है:

*

और सामान्य तारांकन (हाँ, वे समान दिखते हैं):

*

इसलिए, unipropsयह नहीं पता कि यह क्या है, और मैं इसे http://www.fileformat.info/ पर भी नहीं पा सकता हूं । मुझे पता है कि जिस दोस्त ने इसे चिपकाया है वह ओएस एक्स (मैं लिनक्स पर हूं) पर है और यह उनके सिस्टम पर एक नियमित तारांकन के रूप में काम करता है। मैं मान रहा हूं कि स्लैक ने किसी तरह इसे बदल दिया। तो, क्या किसी को भी पता है कि वह चरित्र क्या है?

ध्यान दें कि आप अजीब चरित्र को सीधे प्रश्न से कॉपी नहीं कर सकते हैं। जाहिर है, स्टैक एक्सचेंज इंजन गैर-मुद्रण वर्णों को छीन लेता है। "संपादित करें" लिंक पर क्लिक करें और इसके बजाय वहां से कॉपी करें।


unipropsUnicode::Tussleपर्ल मॉड्यूल में शामिल एक साफ सुथरी स्क्रिप्ट है जो आपके द्वारा दिए गए चरित्र के बारे में जानकारी की पहचान करता है और प्रिंट करता है।


पुनः उत्पन्न नहीं कर सकते। मैंने ord("*")आपके चिपके स्ट्रिंग और देशी *कुंजी का उपयोग किया, और दोनों के लिए समान संख्या (42) प्राप्त की।
मार्च हो

7
@MarchHo लानत है, एसई इंजन इसे खा रहा है। मैंने पोस्ट करने से पहले परीक्षण किया और अजीब चरित्र को कॉपी कर सकता था (हालांकि, मैं यह समझना शुरू कर रहा हूं कि समस्या यह है कि वहां अतिरिक्त, गैर-मुद्रण वर्ण जोड़े गए थे) लेकिन मैं पोस्ट किए गए प्रश्न से कॉपी नहीं कर सकता। आपको एडिट लिंक पर क्लिक करना होगा और वहां से कॉपी करना होगा।
टेराडॉन

2
अजीब तरह से, एंड्रॉइड ऐप पर, अंतरिक्ष के साथ शून्य को प्रदर्शित किया जाता है जैसे कि यह एक सामान्य स्थान था।
derobert

1
दिलचस्प है, जब मैं अपने टर्मिनल में 'एडिट' से पेस्ट करता हूं urxvt, तो यह पहले से ही प्रदर्शित होता है *<200b>
बोडो

यदि आप इसे अपने कोड सेक्शन से कॉपी करते हैं, जैसे कि यूनिप्रॉप्स लाइन, तो यह प्रश्न स्रोत पर जाने की आवश्यकता के बिना ओके को कॉपी करता है। (इसे पायथन 3 दुभाषिए में '*\u200b'भी दिखाया गया है)
TessellatingHeckler

जवाबों:


71

पेस्ट तारांकन के कारण विफल नहीं हुआ, जो कि पूरी तरह से नियमित तारांकन है, लेकिन यूनिकोड वर्ण U + 200B के कारण । जैसा कि चरित्र एक है ZERO WIDTH SPACE, यह कॉपी होने पर प्रदर्शित नहीं होता है।

पायथन कोड का उपयोग करना:

stro=u"'*​'?"
def uniconv(text):
    return " ".join(hex(ord(char)) for char in text)
uniconv(stro)

फ़ंक्शन uniconvइनपुट स्ट्रिंग (इस मामले में u"'*'?") को उनके यूनिकोड कोडपेज समकक्षों में हेक्साडेसिमल प्रारूप में परिवर्तित करता है। uस्ट्रिंग के लिए उपसर्ग एक यूनिकोड स्ट्रिंग के रूप में स्ट्रिंग को पहचानती है।

मैं आउटपुट प्राप्त करने में सक्षम था:

0x27 0x2a 0x200b 0x27 0x3f

हम स्पष्ट रूप से यह देख सकते हैं 0x27, 0x2aऔर 0x3fअक्षर के लिए ASCII / यूनिकोड हेक्साडेसिमल मान हैं ', *और ?क्रमशः। 0x200bइसलिए छोड़ देता है , इसलिए चरित्र की पहचान।

ध्यान दें कि पायथन कोड, जब शरीर में चिपकाया जाता है, तो एसई के मार्काडाउन सॉफ्टवेयर द्वारा यू + 200 बी चरित्र को हटा दिया गया था। अपेक्षित परिणाम प्राप्त करने के लिए, आपको इसे संपादित दृश्य का उपयोग करके सीधे शीर्षक से कॉपी करना होगा।


5
के strसाथ प्रतिस्थापित करने hexसे हेक्साडेसिमल में कोडपॉइंट्स का उत्पादन होगा, जिससे उन्हें पहचानना या देखना आसान हो जाएगा।
डेल्टब

एक समर्पित अजगर मॉड्यूल भी कहा जाता है unicodedata, जिसके साथ आप चरित्र के नाम, श्रेणी आदि को क्वेरी कर सकते हैं
bodo

4
शून्य WIDTH SPACE और ZERO WIDTH JOINER अक्षर टिप्पणी प्रणालियों के साथ प्रयोग करने में आसान हैं जो आम स्पैम शब्दों को ब्लॉक करने का प्रयास करते हैं। उदाहरण के लिए, यह इंगित करने के लिए कि बर्नी सैंडर्स सीनेट के लिए एक सोशलिस्ट के रूप में चुने गए थे ("सियालिस" के लिए एक स्पैम ट्रैप को दोहराए बिना) इसे "सोश & zwj; अलिस्ट" के रूप में लिखते हैं यदि HTML संस्थाओं का सम्मान किया जाता है, या चरित्र मानचित्र से चरित्र में पेस्ट करें; या समकक्ष यदि वे नहीं हैं।
मोंटी हार्डर

27

उबंटू चैट रूम में @ रिनविंड की मदद से, मुझे पता चला कि समस्या चरित्र नहीं है। के उत्पादन पर ध्यान दें od:

$ printf '*​' | od -c
0000000   * 342 200 213
0000004

342 200 213एक और चरित्र का एक अष्टाधारी प्रतिनिधित्व है और हम उपयोग कर सकते हैं इस साइट उसे ढूंढने की:

Character                   ​               
Character name                              ZERO WIDTH SPACE
Hex code point                              200B
Decimal code point                          8203
Hex UTF-8 bytes                             E2 80 8B
Octal UTF-8 bytes                           342 200 213
UTF-8 bytes as Latin-1 characters bytes     â <80> <8B>

इसलिए, मेरे पास वास्तव में दो यूनिकोड वर्ण थे, सामान्य *और एक शून्य चौड़ाई वाला स्थान।


6
ऐसा करने का एक और तरीका है printf '\342\200\213' | uniname। (uniname uniutils पैकेज से है।)
deltab

1
से इस साइट हेक्स के लिए यह देता है: आप अलग प्रारूप रूपांतरण हो सकता है 002A 200Butf-8 के लिए, 2A E2 80 8BUTF-16 के लिए 002A 200B...
Hastur
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.