PHP स्ट्रिंग में यूनिकोड वर्ण


164

यह सवाल शर्मनाक सरल लगता है, लेकिन मैं इसका जवाब नहीं खोज पाया।

PHP कोड के निम्नलिखित C # लाइन के समतुल्य है?

string str = "\u1000";

यह नमूना एक एकल यूनिकोड चरित्र के साथ एक स्ट्रिंग बनाता है जिसका "यूनिकोड संख्यात्मक मान" हेक्साडेसिमल (दशमलव में 4096) में 1000 है।

यही है, PHP में, मैं एक एकल यूनिकोड चरित्र के साथ एक स्ट्रिंग कैसे बना सकता हूं जिसका "यूनिकोड संख्यात्मक मान" ज्ञात है?



4
@diEcho: यह केवल यूनिकोड वर्णों के मिलान के लिए है, लेकिन ओपी उन पात्रों को बनाना चाहता है।
स्टीफन गेहरिग

इससे मदद मिल सकती है: randomchaos.com/documents/?source=php_and_unicode
diEcho

जवाबों:


178

क्योंकि JSON सीधे \uxxxxवाक्य रचना का समर्थन करता है जो मेरे दिमाग में आती है:

$unicodeChar = '\u1000';
echo json_decode('"'.$unicodeChar.'"');

एक अन्य विकल्प का उपयोग करना होगा mb_convert_encoding()

echo mb_convert_encoding('က', 'UTF-8', 'HTML-ENTITIES');

या UTF-16BE (बड़ा एंडियन) और यूनिकोड कोड बिंदु के बीच प्रत्यक्ष मानचित्रण का उपयोग करें:

echo mb_convert_encoding("\x10\x00", 'UTF-8', 'UTF-16BE');

9
JSON जावास्क्रिप्ट नहीं है।
गंबू

4
@ गुम्बो: मुझे पता है कि लेकिन यहाँ कोई फर्क नहीं पड़ता। जावास्क्रिप्ट के साथ-साथ JSON \uxxxxयूनिकोड सिंटैक्स का समर्थन करता है ताकि आप json_decodeआर्टिफिशियल रूप से बनाए गए JSON स्ट्रिंग प्रतिनिधित्व पर काम कर सकें । मैंने शब्दांकन को बदल दिया है, हालांकि यह स्पष्ट किया है।
स्टीफन गेहरिग

3
ठीक है, तो मेरे सवाल का एक जवाब का सख्त सूत्रीकरण है: $ str = json_decode ('"\ u1000"'); धन्यवाद।
Telaclavo

मैंने कोशिश की, echo json_decode('\u201B');जो एक भीhd
उलटे हुए उद्धरण का उल्लेख करता है

4
आपको जरूरत है echo json_decode('"\u201B"');। यूनिकोड प्रतीक के चारों ओर दोहरे उद्धरण अनिवार्य हैं।
स्टीफन गेह्रिग

162

PHP 7.0.0 ने "यूनिकोड कोडपॉइंट एस्केप" सिंटैक्स पेश किया है

अब बिना किसी फ़ंक्शन को कॉल किए, डबल-उद्धृत या एक हेरेडोक स्ट्रिंग का उपयोग करके यूनिकोड वर्णों को आसानी से लिखना संभव है ।

$unicodeChar = "\u{1000}";

इसका उपयोग इस तरह किया जा सकता है: wordwrap($longLongText, 20, "\u{200B}", true);( शून्य-चौड़ाई वाला स्थान )
sanmai

5
मेरा मानना ​​है कि ओपी यह उत्तर चाहता था, स्वीकृत उत्तर नहीं। किसी भी दर पर, जब मैंने "यूनिकोड इन पीएचपी" की खोज की, तो यह इसलिए था क्योंकि मैं यह उत्तर चाहता था, स्वीकृत उत्तर नहीं। शायद "\ u {abcd}" तब मौजूद नहीं था जब यह प्रश्न पहली बार पूछा गया था। यदि हां, तो स्वीकृत उत्तर को अब स्थानांतरित कर दिया जाना चाहिए।
एडम चालिसटन

23

मुझे आश्चर्य है कि किसी ने भी अभी तक इसका उल्लेख नहीं किया है, लेकिन आप डबल उद्धृत स्ट्रिंग्स में एस्केप सीक्वेंस का उपयोग करके लगभग बराबर संस्करण कर सकते हैं :

\x[0-9A-Fa-f]{1,2}

नियमित अभिव्यक्ति से मेल खाने वाले पात्रों का अनुक्रम हेक्साडेसिमल संकेतन में एक चरित्र है।

ASCII उदाहरण:

<?php
    echo("\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x21");
?>

नमस्ते दुनिया!

तो आपके मामले के लिए, आपको बस इतना करना चाहिए $str = "\x30\xA2";। लेकिन ये बाइट्स हैं , वर्ण नहीं। यूनिकोड कोड पॉइंट का बाइट प्रतिनिधित्व UTF-16 बड़े एंडियन के साथ मेल खाता है, इसलिए हम इसे निम्न प्रकार से प्रिंट कर सकते हैं:

<?php
    header('content-type:text/html;charset=utf-16be');
    echo("\x30\xA2");
?>

यदि आप एक अलग एन्कोडिंग का उपयोग कर रहे हैं, तो आपको तदनुसार बाइट्स को बदलने की आवश्यकता होगी (ज्यादातर एक पुस्तकालय के साथ किया जाता है, हालांकि हाथ से भी संभव है)।

UTF-16 छोटे एंडियन उदाहरण:

<?php
    header('content-type:text/html;charset=utf-16le');
    echo("\xA2\x30");
?>

UTF-8 उदाहरण:

<?php
    header('content-type:text/html;charset=utf-8');
    echo("\xE3\x82\xA2");
?>

packफ़ंक्शन भी है , लेकिन आप इसे धीमा होने की उम्मीद कर सकते हैं।


बुलेट चरित्र को कॉपी / पेस्ट करते समय (स्रोत में दस्तावेज़ में UTF-8 एन्कोडिंग त्रुटि के कारण हो सकता है) चिपकाने के लिए बिल्कुल सही। धन्यवाद।
जिम्प

21

PHP इन यूनिकोड एस्केप सीक्वेंस को नहीं जानता है। लेकिन जैसे ही अज्ञात भागने के क्रम अप्रभावित रहते हैं, आप अपने स्वयं के फ़ंक्शन को लिख सकते हैं जो इस तरह के यूनिकोड एस्केप अनुक्रमों को परिवर्तित करता है:

function unicodeString($str, $encoding=null) {
    if (is_null($encoding)) $encoding = ini_get('mbstring.internal_encoding');
    return preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/u', create_function('$match', 'return mb_convert_encoding(pack("H*", $match[1]), '.var_export($encoding, true).', "UTF-16BE");'), $str);
}

या इसके बजाय एक अनाम फ़ंक्शन अभिव्यक्ति के साथ create_function:

function unicodeString($str, $encoding=null) {
    if (is_null($encoding)) $encoding = ini_get('mbstring.internal_encoding');
    return preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/u', function($match) use ($encoding) {
        return mb_convert_encoding(pack('H*', $match[1]), $encoding, 'UTF-16BE');
    }, $str);
}

इसका उपयोग:

$str = unicodeString("\u1000");

10
html_entity_decode('&#x30a8;', 0, 'UTF-8');

यह भी काम करता है। हालाँकि json_decode () समाधान बहुत तेज़ (लगभग 50 बार) है।


सरल, सुरुचिपूर्ण, सीधी और पूरी तरह से सुरक्षित विधि। +10
andreszs


3

जैसा कि दूसरों ने उल्लेख किया है, PHP 7 \uयूनिकोड सिंटैक्स के लिए सीधे समर्थन का परिचय देता है ।

जैसा कि दूसरों द्वारा भी उल्लेख किया गया है, PHP में किसी भी समझदार यूनिकोड वर्ण विवरण से एक स्ट्रिंग मान प्राप्त करने का एकमात्र तरीका है, इसे किसी और चीज़ से परिवर्तित करके (जैसे JSON पार्सिंग, HTML पार्सिंग या कुछ अन्य रूप)। लेकिन यह रन-टाइम प्रदर्शन लागत पर आता है।

हालांकि, एक अन्य विकल्प है। आप \xद्विआधारी भागने के साथ PHP में सीधे चरित्र को एन्कोड कर सकते हैं । \xभागने वाक्य रचना भी है PHP 5 में समर्थित

यह विशेष रूप से उपयोगी है यदि आप अपने प्राकृतिक रूप के माध्यम से सीधे एक स्ट्रिंग में चरित्र में प्रवेश नहीं करना पसंद करते हैं। उदाहरण के लिए, यदि यह एक अदृश्य नियंत्रण चरित्र है, या व्हॉट्सएप का पता लगाने के लिए अन्य कठिन है।

सबसे पहले, एक सबूत उदाहरण:

// Unicode Character 'HAIR SPACE' (U+200A)
$htmlEntityChar = "&#8202;";
$realChar = html_entity_decode($htmlEntityChar);
$phpChar = "\xE2\x80\x8A";
echo 'Proof: ';
var_dump($realChar === $phpChar); // bool(true)

ध्यान दें कि, एक अन्य उत्तर में पेसियर द्वारा उल्लिखित, यह बाइनरी कोड विशिष्ट वर्ण एन्कोडिंग के लिए अद्वितीय है। उपरोक्त उदाहरण में, \xE2\x80\x8Aयूटीएफ -8 में यू + 200 ए के लिए बाइनरी कोडिंग है।

अगला प्रश्न, कैसे आप से मिलता है है U+200Aकरने के लिए \xE2\x80\x8A?

नीचे एक मूल अक्षर के रूप में एक बार JSON स्ट्रिंग, HTML इकाई, या किसी अन्य विधि के आधार पर, किसी भी वर्ण के लिए एस्केप अनुक्रम उत्पन्न करने के लिए एक PHP स्क्रिप्ट है।

function str_encode_utf8binary($str) {
    /** @author Krinkle 2018 */
    $output = '';
    foreach (str_split($str) as $octet) {
        $ordInt = ord($octet);
        // Convert from int (base 10) to hex (base 16), for PHP \x syntax
        $ordHex = base_convert($ordInt, 10, 16);
        $output .= '\x' . $ordHex;
    }
    return $output;
}

function str_convert_html_to_utf8binary($str) {
    return str_encode_utf8binary(html_entity_decode($str));
}
function str_convert_json_to_utf8binary($str) {
    return str_encode_utf8binary(json_decode($str));
}

// Example for raw string: Unicode Character 'INFINITY' (U+221E)
echo str_encode_utf8binary('∞') . "\n";
// \xe2\x88\x9e

// Example for HTML: Unicode Character 'HAIR SPACE' (U+200A)
echo str_convert_html_to_utf8binary('&#8202;') . "\n";
// \xe2\x80\x8a

// Example for JSON: Unicode Character 'HAIR SPACE' (U+200A)
echo str_convert_json_to_utf8binary('"\u200a"') . "\n";
// \xe2\x80\x8a

0
function unicode_to_textstring($str){

    $rawstr = pack('H*', $str);

    $newstr =  iconv('UTF-16BE', 'UTF-8', $rawstr);
    return $newstr;
}

$ msg = '67714eac99c500200054006f006b0079006f002000530074006100740069006f006e003a0020';

इको यूनिकोड_टो_टेक्स्टस्ट्रिंग ($ str);

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.