2008-12-28 7 views
15

मैं किसी दिए गए यूटीएफ -8 स्ट्रिंग के लिए यूसीएस-2 कोड पॉइंट प्राप्त करना चाहता हूं। उदाहरण के लिए "हैलो" शब्द "0068 0065 006 सी 006 सी 006F" जैसा कुछ बनना चाहिए। कृपया ध्यान दें कि पात्र पूर्वी एशियाई भाषाओं जैसी जटिल लिपियों सहित किसी भी भाषा से हो सकते हैं।किसी utf-8 स्ट्रिंग में दिए गए वर्ण के लिए कोड पॉइंट नंबर कैसे प्राप्त करें?

तो, समस्या के लिए नीचे आता है

लेकिन यह कैसे "अपने यूसीएस -2 कोड बात करने के लिए किसी दिए गए चरित्र बदल"? कृपया, किसी भी तरह की मदद की बहुत सराहना की जाएगी क्योंकि मैं बहुत जल्दी हूं।

अग्रिम धन्यवाद


प्रश्नकर्ता की प्रतिक्रिया का ट्रांसक्रिप्शन एक जवाब के रूप तैनात

अपने उत्तर के लिए धन्यवाद, लेकिन यह पीएचपी वी 4 या 5 में किया जाना चाहिए, लेकिन नहीं 6.

स्ट्रिंग एक फॉर्म फ़ील्ड से उपयोगकर्ता इनपुट होगा।

मैं एक PHP या

function get_ucs2_codepoint($char) 
{ 
    // calculation of ucs2 codepoint value and assign it to $hex_codepoint 
    return $hex_codepoint; 
} 

तरह utf8to16 के संस्करण utf8decode लागू करना चाहते हैं क्या आप मुझे पीएचपी साथ मदद कर सकते हैं या इसके साथ संस्करण के साथ PHP ऊपर उल्लेख किया जा सकता है?

फिर से धन्यवाद।

+1

कौन सा प्रोग्रामिंग भाषा? –

उत्तर

7

Scott Reynenconvert UTF-8 into Unicode करने के लिए एक समारोह में लिखा था। मैंने इसे PHP documentation पर देखा।

function utf8_to_unicode($str) { 

    $unicode = array();   
    $values = array(); 
    $lookingFor = 1; 

    for ($i = 0; $i < strlen($str); $i++) { 
     $thisValue = ord($str[ $i ]); 
    if ($thisValue < ord('A')) { 
     // exclude 0-9 
     if ($thisValue >= ord('0') && $thisValue <= ord('9')) { 
      // number 
      $unicode[] = chr($thisValue); 
     } 
     else { 
      $unicode[] = '%'.dechex($thisValue); 
     } 
    } else { 
      if ($thisValue < 128) 
     $unicode[] = $str[ $i ]; 
      else { 
       if (count($values) == 0) $lookingFor = ($thisValue < 224) ? 2 : 3;     
       $values[] = $thisValue;     
       if (count($values) == $lookingFor) { 
        $number = ($lookingFor == 3) ? 
         (($values[0] % 16) * 4096) + (($values[1] % 64) * 64) + ($values[2] % 64): 
         (($values[0] % 32) * 64) + ($values[1] % 64); 
      $number = dechex($number); 
      $unicode[] = (strlen($number)==3)?"%u0".$number:"%u".$number; 
        $values = array(); 
        $lookingFor = 1; 
      } // if 
     } // if 
    } 
    } // for 
    return implode("",$unicode); 

} // utf8_to_unicode 
+13

मैंने उस समारोह को लिखा था। मूल यहां कुछ अन्य कार्यों के साथ उपयोगी है: http://randomchaos.com/documents/?source=php_and_unicode –

+1

@ रेनेन, छोटी दुनिया, एह? मैंने आपको क्रेडिट और कुछ विज्ञापन देने के लिए अपनी पोस्ट संपादित की है। ; डी – strager

+2

कृपया, कृपया, इसे 'utf8_to_utf16' पर कॉल करें। दोनों "यूनिकोड" हैं जिस तरह से दोनों यूनिकोड कोड बिंदुओं के लिए प्रतिनिधित्व हैं। – DarkDust

11

मौजूदा उपयोगिता जैसे iconv, या जो भी पुस्तकालय आप उपयोग कर रहे हैं उसके साथ आते हैं।

यदि आप अपना स्वयं का समाधान रोल करने का आग्रह करते हैं, तो UTF-8 प्रारूप पर पढ़ें। असल में, कोड बिंदु के मूल्य के आधार पर, प्रत्येक कोड बिंदु को 1-4 बाइट के रूप में संग्रहीत किया जाता है। 1 बाइट: 0xxxxxxx

  • U + 0080 - U + 07FF: 2 बाइट्स: 110xxxxx 10xxxxxx
  • U + 0800 - U + FFFF - U + 007F

    • U + 0000: पर्वतमाला इस प्रकार हैं : 3 बाइट्स: 1110xxxx 10xxxxxx 10xxxxxx
    • U + 10000 - U + 10FFFF: 4 बाइट्स: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

    कहाँ प्रत्येक x एक डेटा बिट है। इस प्रकार, आप बता सकते हैं कि कितने बाइट्स पहले बाइट को देखकर प्रत्येक कोड बिंदु बनाते हैं: यदि यह 0 से शुरू होता है, तो यह 1-बाइट वर्ण है। यदि यह 110 के साथ शुरू होता है, तो यह 2-बाइट वर्ण है। यदि यह 1110 के साथ शुरू होता है, तो यह 3-बाइट वर्ण है। यदि यह 11110 के साथ शुरू होता है, तो यह 4-बाइट वर्ण है। यदि यह 10 के साथ शुरू होता है, तो यह एक मल्टीबाइट चरित्र का एक गैर प्रारंभिक बाइट है। यदि यह 11111 के साथ शुरू होता है, तो यह एक अवैध चरित्र है।

    एक बार जब आप पता लगाते हैं कि चरित्र में कितने बाइट हैं, तो यह थोड़ा मामूली बात है। यह भी ध्यान रखें कि यूसीएस -2 यू + एफएफएफएफ के ऊपर वर्णों का प्रतिनिधित्व नहीं कर सकता है।

    चूंकि आप एक भाषा निर्दिष्ट नहीं किया है, यहाँ कुछ नमूना सी कोड है (त्रुटि लोप जाँच):

    wchar_t utf8_char_to_ucs2(const unsigned char *utf8) 
    { 
        if(!(utf8[0] & 0x80))  // 0xxxxxxx 
        return (wchar_t)utf8[0]; 
        else if((utf8[0] & 0xE0) == 0xC0) // 110xxxxx 
        return (wchar_t)(((utf8[0] & 0x1F) << 6) | (utf8[1] & 0x3F)); 
        else if((utf8[0] & 0xF0) == 0xE0) // 1110xxxx 
        return (wchar_t)(((utf8[0] & 0x0F) << 12) | ((utf8[1] & 0x3F) << 6) | (utf8[2] & 0x3F)); 
        else 
        return ERROR; // uh-oh, UCS-2 can't handle code points this high 
    } 
    
  • 4

    मैं खुश हूं, क्योंकि मैं तो बस एक अंतिम परीक्षा में छात्रों के लिए इस समस्या को दे दी है।यहाँ UTF-8 का चित्र है:

    hex   binary     UTF-8 binary 
    0000-007F 00000000 0abcdefg => 0abcdefg 
    0080-07FF 00000abc defghijk => 110abcde 10fghijk 
    0800-FFFF abcdefgh ijklmnop => 1110abcd 10efghij 10klmnop 
    

    और यहाँ कुछ C99 कोड है:

    static void check(char c) { 
        if ((c & 0xc0) != 0xc0) RAISE(Bad_UTF8); 
    } 
    
    uint16_t Utf8_decode(char **p) { // return code point and advance *p 
        char *s = *p; 
        if ((s[0] & 0x80) == 0) { 
        (*p)++; 
        return s[0]; 
        } else if ((s[0] & 0x40) == 0) { 
        RAISE (Bad_UTF8); 
        return ~0; // prevent compiler warning 
        } else if ((s[0] & 0x20) == 0) { 
        if ((s[0] & 0xf0) != 0xe0) RAISE (Bad_UTF8); 
        check(s[1]); check(s[2]); 
        (*p) += 3; 
        return ((s[0] & 0x0f) << 12) 
         + ((s[1] & 0x3f) << 6) 
         + ((s[2] & 0x3f)); 
        } else { 
        check(s[1]); 
        (*p) += 2; 
        return ((s[0] & 0x1f) << 6) 
         + ((s[1] & 0x3f)); 
        } 
    }  
    
    +0

    हूप्स, सी कोड के साथ अपना समय बर्बाद करने के लिए खेद है। लेकिन मुझे आशा है कि आपको थोड़ा आरेख उपयोगी लगेगा। –

    +0

    चेक() फ़ंक्शन टूटा नहीं है? यह परीक्षण नहीं करना चाहिए: अगर ((सी और 0xC0)! = 0x80)? इसके अलावा, आरएएसईई मैक्रो क्या है? –

    +1

    चेक() फ़ंक्शन में बग फिक्स के लिए धन्यवाद। फाइनल से पहले रात को कोड लिखने के लिए मुझे सही काम करता है। RAISE http://www.cs.princeton.edu/software/cii/ से है। –

    4

    PHP कोड (जो वैध UTF-8 मान लिया गया है, गैर मान्य utf-8 के लिए कोई चेक):

    function ord_utf8($c) { 
        $b0 = ord($c[0]); 
        if ($b0 < 0x10) { 
         return $b0; 
         } 
        $b1 = ord($c[1]); 
        if ($b0 < 0xE0) { 
         return (($b0 & 0x1F) << 6) + ($b1 & 0x3F); 
         } 
        return (($b0 & 0x0F) << 12) + (($b1 & 0x3F) << 6) + (ord($c[2]) & 0x3F); 
        } 
    
    +0

    बहुत अच्छा, सिवाय इसके कि जब यह चरित्र पहले से ही ASCII है तो यह विफल हो जाता है। पूर्ण ASCII रेंज को पकड़ने के लिए 0x10 0x80 होना चाहिए। – TextGeek

    संबंधित मुद्दे