2010-09-13 15 views
7

एक सीआईएल PHP स्क्रिप्ट से आउटपुट होने के इच्छुक एक चरित्र के लिए यूनिकोड दशमलव या हेक्स संख्या को देखते हुए, PHP इसे कैसे उत्पन्न कर सकता है? chr() फ़ंक्शन उचित आउटपुट उत्पन्न नहीं करता है। यहाँ मेरी परीक्षण स्क्रिप्ट है, धारा तोड़ चरित्र U + 00A7 का उपयोग कर एक परीक्षण के रूप (हेक्स में ए 7, दशमलव में 167, UTF-8 में सी 2 ए 7 के रूप में प्रतिनिधित्व किया जाना चाहिए):PHP एक यूनिकोड स्ट्रिंग का निर्माण?

<?php 
echo "Section sign: ".chr(167)."\n"; // Using CHR function 
echo "Section sign: ".chr(0xA7)."\n"; 
echo "Section sign: ".pack("c", 0xA7)."\n"; // Using pack function? 
echo "Section sign: §\n"; // Copy and paste of the symbol into source code 

निर्गम (के माध्यम से मुझे मिलता है सर्वर के लिए एक SSH सत्र) है:

तो, साबित करता है कि मैं उपयोग कर रहा हूँ टर्मिनल फ़ॉन्ट उस में धारा तोड़ चरित्र है, और SSH कनेक्शन यह भेज रहा है साथ सफलतापूर्वक, लेकिन chr() 'isn कोड संख्या से इसे बनाते समय इसे ठीक से बनाते हैं।

यदि मुझे बस मिला है तो कोड संख्या है और कॉपी/पेस्ट विकल्प नहीं है, मेरे पास कौन से विकल्प हैं?

उत्तर

4

PHP को एमबी_ फ़ंक्शन और आइकनव को छोड़कर यूनिकोड का कोई ज्ञान नहीं है। आपको यूटीएफ -8 चरित्र को एन्कोड करना होगा।

इसके लिए, विकिपीडिया में excellent overview है जिस पर यूटीएफ -8 संरचित है। यहाँ है कि लेख के आधार पर एक त्वरित, गंदा और untested समारोह है:

function codepointToUtf8($codepoint) 
{ 
    if ($codepoint < 0x7F) // U+0000-U+007F - 1 byte 
     return chr($codepoint); 
    if ($codepoint < 0x7FF) // U+0080-U+07FF - 2 bytes 
     return chr(0xC0 | ($codepoint >> 6)).chr(0x80 | ($codepoint & 0x3F); 
    if ($codepoint < 0xFFFF) // U+0800-U+FFFF - 3 bytes 
     return chr(0xE0 | ($codepoint >> 12)).chr(0x80 | (($codepoint >> 6) & 0x3F).chr(0x80 | ($codepoint & 0x3F); 
    else // U+010000-U+10FFFF - 4 bytes 
     return chr(0xF0 | ($codepoint >> 18)).chr(0x80 | ($codepoint >> 12) & 0x3F).chr(0x80 | (($codepoint >> 6) & 0x3F).chr(0x80 | ($codepoint & 0x3F); 
} 
+0

ऐसा करने का एक शानदार तरीका है कि पहले यूटीएफ -8 में PHP दस्तावेज़ को लिखना होगा। –

+0

उत्कृष्ट जवाब, माइकल; और समारोह के लिए धन्यवाद! मैंने बार-बार chr की बजाय पैक फ़ंक्शन का उपयोग करके अपने लिए कुछ समान बनाया। बिली, इस विशिष्ट उद्देश्य के लिए, मुझे कोडपॉइंट से एक चरित्र में जाना होगा; पहले से एम्बेडेड वर्णों के साथ यूटीएफ -8 में PHP स्क्रिप्ट लिखना एक विकल्प नहीं है। – MidnightLightning

3

मत भूलना कि UTF-8 एक चर लंबाई एन्कोडिंग है।

§ पहले 128 (ASCII) वर्णों में शामिल नहीं है जो यूटीएफ -8 एक बाइट में प्रदर्शित करने में सक्षम है। § यूटीएफ -8 में एक बहु-बाइट वर्ण है, जो c2 बाइट द्वारा प्रीपेड किया गया है जो first byte of a two-byte sequence. को दर्शाता है। यह काम करना चाहिए:

echo "Section sign: ".chr(0xC2).chr(0xA7)."\n"; 
3
chr 

(PHP 4, PHP 5) 

chr — Return a specific character 

Report a bug 
Description 

string chr (int $ascii) 
Returns a one-character string containing the character specified by ascii. 

इस समारोह ord पूरक()।

महत्वपूर्ण शब्द ascii :) कोशिश यह एक है:

function uchr ($codes) { 
     if (is_scalar($codes)) $codes= func_get_args(); 
     $str= ''; 
     foreach ($codes as $code) $str.= html_entity_decode('&#'.$code.';',ENT_NOQUOTES,'UTF-8'); 
     return $str; 
    } 
    echo "Section sign: ".uchr(167)."\n"; // Using CHR function 
    echo "Section sign: ".uchr(0xA7)."\n"; 
5

मान लिया जाये कि आप iconv है, यहाँ एक आसान तरीका है कि लागू करने को शामिल नहीं करता है UTF-8 अपने आप को:

function unichr($i) { 
    return iconv('UCS-4LE', 'UTF-8', pack('V', $i)); 
} 
0

मुझे पता है कि मैं एक पुराने, हल किए गए मुद्दे को फिर से खोल रहा हूं, हालांकि जब से मैं उस विषय में मदद के लिए खोज कर रहा था, मैंने सोचा कि मैं उस समाधान को साझा करूंगा जिसके साथ मैं समाप्त हुआ हूं। प्रश्न पूछने वाले प्रारंभिक व्यक्ति को अपने कोड को सर्वोत्तम रूप से पुन: सक्रिय करने में रुचि हो सकती है।

असीसी-टू-यूनिकोड मैन्युअल रूप से पुन: प्रोग्रामिंग पहिया को फिर से शुरू करने की तरह है, त्रुटियों/प्रदर्शन क्षमता के बारे में बात नहीं कर रहा है।

सबसे अच्छा समाधान मैंने पाया उपयोग करने के लिए किया गया था:

  1. pack डेटा की सही मात्रा खाने के लिए उचित कोड का उपयोग इनपुट डेटा से मूल्यों को बनाने के लिए, है, आमतौर पर pack("H*", <input data>) हेक्साडेसिमल से पढ़ने के लिए महत्व देता
  2. mb_convert_encodingmb_convert_encoding(<ASCII string>, "UTF-8") का उपयोग करके, ASCII तारों को यूनिकोड वाले में परिवर्तित करने के लिए। यदि इनपुट स्ट्रिंग ठीक से पहचाना नहीं गया है, तो इस फ़ंक्शन का एक तीसरा पैरामीटर इनपुट एन्कोडिंग
संबंधित मुद्दे