Friday, 15 August 2014

Perl's default string encoding and representation -


निम्न में:

मेरी $ string = "क्या आप \ x {FB01} nd मेरी r \ x {E9} योग \ x {E9} \ n ";?

<कोड> x {FB01} और x {} E9 कोड बिंदु हैं और कोड अंक ओक्टेट्स की एक श्रृंखला के लिए एक एन्कोडिंग स्कीम के माध्यम से इनकोड। चरित्र एक जो कोडपॉइंट \ x {FB01} है
तो का हिस्सा है $ string की स्ट्रिंग लेकिन यह कैसे काम करता है? क्या सभी अक्षर इस वाक्य में (एएससीआई वाले लोगों सहित) UTF-8 के माध्यम से एन्कोड किए गए हैं? अगर हाँ, तो मुझे निम्नलिखित व्यवहार क्यों मिलता है?

  मेरी $ str = "कुछ मनमाना स्ट्रिंग \ n"; यदि (एनकोड :: is_utf8 ($ str)) {प्रिंट "हाँ एसआर यूटीएफ 8! \ N"; } अन्य {प्रिंट "नहीं, यह नहीं है यूटीएफ 8 \ n"; }   

यह प्रिंट "नहीं str आईटी UTF8 \ N नहीं है"
इसके अतिरिक्त एनकोड :: is_utf8 ($ स्ट्रिंग) रिटर्न true
किस प्रकार से $ string और $ str अलग और एक माना जाता है UTF-8 और अन्य नहीं?
और किसी भी मामले में $ str का एन्कोडिंग क्या है? ASCII? क्या यह पर्ल के लिए डिफ़ॉल्ट है?

सी में, एक स्ट्रिंग एक है ऑकटेट का संग्रह, लेकिन पर्ल के दो स्ट्रिंग स्टोरेज स्वरूप हैं:

  • 8-बिट मानों की स्ट्रिंग।
  • 72-बिट मानों की स्ट्रिंग (व्यवहार में, 32-बिट या 64-बिट तक सीमित।)

    इस तरह, आपको स्ट्रिंग में उन्हें स्टोर करने के लिए कोड बिंदुओं को सांकेतिकृत करने की आवश्यकता नहीं है। < पूर्व> मेरी $ s = "\ x {2660} \ x {2661}"; लंबाई $ s; # 2 कहते हैं, sprintf '% X', ord substr ($ s, 0, 1); # 2660 का कहना है कि sprintf '% x', ऑर्ड सबस्ट्रेल ($ s, 1, 1); # 2661

    (आंतरिक रूप से, "UTF8" कहा जाता है UTF-8 का ही विस्तार 72-बिट वर्ण के तार स्टोर करने के लिए प्रयोग किया जाता है। यही कारण है कि कुछ आप कभी भी महसूस करने के लिए छोड़कर पता करने के लिए होना चाहिए नहीं है प्रदर्शन के प्रभाव, लेकिन इस तथ्य को बेनकाब करने वाली बग हैं।)

    एन्कोड का is_utf8 रिपोर्ट करता है कि किस प्रकार के स्ट्रैक्टर में एक स्केलर होता है यह एक ऐसा कार्य है जो पहले से उल्लेखित बगों को डिबग करने के अलावा कोई भी उपयोग नहीं करता है।

    • एक 8-बिट स्ट्रिंग $ str का मान संग्रहीत कर सकता है, इसलिए पर्ल का उपयोग अधिक कुशल 8-बिट (UTF8 = 0) स्ट्रिंग प्रारूप।
    • एक 8-बिट स्ट्रिंग $ string के मान को संचित नहीं कर सकता है, इसलिए पर्ल 72-बिट (UTF8 = 1) स्ट्रिंग फ़ॉर्मेट।

      शून्य शून्य है क्या यह एक फ़्लोटिंग बिंदु संख्या, एक हस्ताक्षरित पूर्णांक या एक हस्ताक्षरित पूर्णांक में संग्रहीत है इसी तरह, स्ट्रिंग का भंडारण प्रारूप स्ट्रिंग के मूल्य के बारे में कोई जानकारी नहीं देता।

      • आप कोड बिंदुओं को 8-बिट स्ट्रिंग में संग्रहीत कर सकते हैं (यदि वे काफी छोटे हैं) बस के रूप में आसानी से एक 72-बिट स्ट्रिंग।
      • आप बाइट्स को एक 72-बिट स्ट्रिंग में 8-बिट स्ट्रिंग के रूप में आसानी से स्टोर कर सकते हैं।

        वास्तव में, पर्ल स्विच होगा इच्छा के दो प्रारूपों के बीच उदाहरण के लिए, यदि आप $ string को $ str के साथ जोड़ते हैं, तो आपको 72-बिट प्रारूप में एक स्ट्रिंग मिल जाएगी।

        आप बदल सकते हैं utf8 :: डाउनग्रेड और utf8 :: upgrade के साथ एक स्ट्रिंग का भंडारण प्रारूप, आपको कभी भी बग के आसपास काम करने की आवश्यकता होनी चाहिए।

         < कोड> UTF8 :: ढाल ($ रों); # 8-बिट मानों के स्ट्रिंग पर स्विच करें (UTF8 = 0)। UTF8 उन्नयन :: ($ रों); # 72-बिट मानों (UTF8 = 1) के तार पर स्विच करें   

        आप कर सकते हैं Devel :: नज़र का उपयोग कर प्रभाव

          & gt;। पर्ल -MDevel :: पीक -e "$ एस = chr (0x80); Utf8 :: डाउनग्रेड ($ s); डंप ($ s); " एसवी = 0x4a84c4 REFCNT पर पीवी (0x7b8a74) = 1 FLAGS = (पीओके, pPOK) PV = 0x7bab9c "\ 200" \ 0 CUR = 1 LEN = 12 & gt; पर्ल -MDevel :: पीक -e "$ एस = chr (0x80 ); Utf8 :: अपग्रेड ($ s); डंप ($ s); " एसवी = पीवी (0x558a6c) 0x1cc843c पर REFCNT = 1 फ्लैग्स = (पीओके, पीपीओके, यूटीएफ 8) पीवी = 0x55ab94 "\ 302 \ 200" \ 0 [यूटीएफ 8 "\ x {80}"] कूर = 2 एलएएन = 12    

No comments:

Post a Comment