যথাযথ ইউটিএফ -8 এনকোডযুক্ত অক্ষরগুলির জন্য "\ u00ed" এর মতো ইউনিকোড পালানোর ক্রমগুলি কীভাবে ডিকোড করবেন?


100

পিএইচপি-তে এমন কোনও ফাংশন রয়েছে যা " \u00ed" থেকে " í" এর মতো ইউনিকোড পালানোর সিকোয়েন্সগুলি এবং অন্যান্য সমস্ত অনুরূপ ঘটনা ডিকোড করতে পারে ?

আমি একই প্রশ্ন পাওয়া এখানে কিন্তু কাজ বলে মনে হচ্ছে না।

উত্তর:


174

এটা চেষ্টা কর:

$str = preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/', function ($match) {
    return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE');
}, $str);

ক্ষেত্রে এটি ইউটিএফ -16 ভিত্তিক সি / সি ++ / জাভা / জসন-স্টাইল:

$str = preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/', function ($match) {
    return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UTF-16BE');
}, $str);

4
আমি "00 u00ed" কোথায় রাখি?
ডকস্টোরো

4
@ ডকস্টো: নিয়মিত প্রকাশটি \uচারটি হেক্সাডেসিমাল অঙ্কের পরে থাকা কোনও ক্রমের সাথে মিলবে ।
গম্বো

9
এই ফাংশন পরিপূরক চরিত্রগুলির সাথে ডিল করতে পারে না কারণ তারা ইউসিএস -২ এ প্রতিনিধিত্ব করতে পারে না।
আর্টেফ্যাক্টো

4
@ গম্বো আপনি এই ফাংশনটি কীভাবে কল করবেন বা ব্যবহার করবেন?
দেমডাভ

4
আমি আমার আউটপুটটিতে যেমন ছিলাম তেমনি আমি এখানে আমার পথটি খুঁজে পেয়েছি, তবে আমি json_encode () এর সাথে আউটপুটটির দিকে চেয়েছিলাম এবং মজাদারভাবে ডিফল্ট json_encode () আউটপুটটি ট্র্যাশ করবে তাই json_encode ব্যবহার করবে (D theDict, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
টম অ্যান্ডারসন

72
print_r(json_decode('{"t":"\u00ed"}')); // -> stdClass Object ( [t] => í )

46
এমনকি এটির জন্য বস্তুর মোড়কের প্রয়োজন নেই:json_decode('"' . $text . '"')
ছদ্মবেশ

4
ধন্যবাদ এটি স্ট্যান্ডার্ড ওয়ে বলে মনে হচ্ছে , তারপরে উত্তরটি গৃহীত হবে।
টুডো

মজার বিষয় হল, এটি স্মাইলি json_decode('{"t":"\uD83D\uDE0A"}')
ফেসগুলির

4
@ অনুধাবন করা উচিত যে $textডাবল উক্তি অন্তর্ভুক্ত করতে পারে এমন তথ্যটি আপনার অন্তর্ভুক্ত করা উচিত । সুতরাং একটি সংশোধিত সংস্করণ হতে হবে: json_decode('"'.str_replace('"', '\\"', $text).'"')। আপনার সাহায্যের :-) জন্য ধন্যবাদ
Yvan


11
$str = '\u0063\u0061\u0074'.'\ud83d\ude38';
$str2 = '\u0063\u0061\u0074'.'\ud83d';

// U+1F638
var_dump(
    "cat\xF0\x9F\x98\xB8" === escape_sequence_decode($str),
    "cat\xEF\xBF\xBD" === escape_sequence_decode($str2)
);

function escape_sequence_decode($str) {

    // [U+D800 - U+DBFF][U+DC00 - U+DFFF]|[U+0000 - U+FFFF]
    $regex = '/\\\u([dD][89abAB][\da-fA-F]{2})\\\u([dD][c-fC-F][\da-fA-F]{2})
              |\\\u([\da-fA-F]{4})/sx';

    return preg_replace_callback($regex, function($matches) {

        if (isset($matches[3])) {
            $cp = hexdec($matches[3]);
        } else {
            $lead = hexdec($matches[1]);
            $trail = hexdec($matches[2]);

            // http://unicode.org/faq/utf_bom.html#utf16-4
            $cp = ($lead << 10) + $trail + 0x10000 - (0xD800 << 10) - 0xDC00;
        }

        // https://tools.ietf.org/html/rfc3629#section-3
        // Characters between U+D800 and U+DFFF are not allowed in UTF-8
        if ($cp > 0xD7FF && 0xE000 > $cp) {
            $cp = 0xFFFD;
        }

        // https://github.com/php/php-src/blob/php-5.6.4/ext/standard/html.c#L471
        // php_utf32_utf8(unsigned char *buf, unsigned k)

        if ($cp < 0x80) {
            return chr($cp);
        } else if ($cp < 0xA0) {
            return chr(0xC0 | $cp >> 6).chr(0x80 | $cp & 0x3F);
        }

        return html_entity_decode('&#'.$cp.';');
    }, $str);
}

ধন্যবাদ. এটি পরিপূরক চরিত্রের সাথে কাজ করে বলে মনে হচ্ছে, যেমন😍
c00000fd

3

এইচটিএমএল দিয়ে কাঁচা ইউনিকোডে প্রতিস্থাপন করার জন্য এটি একটি স্লেজহ্যামার পদ্ধতি। আমি এই সমাধানটি দেওয়ার জন্য অন্য কোনও জায়গা দেখিনি, তবে আমি ধরে নিয়েছি অন্যদেরও এই সমস্যা হয়েছে।

আর কিছু করার আগে এই আরআরপ্লেস ফাংশনটি RAW JSON এ প্রয়োগ করুন ।

function unicode2html($str){
    $i=65535;
    while($i>0){
        $hex=dechex($i);
        $str=str_replace("\u$hex","&#$i;",$str);
        $i--;
     }
     return $str;
}

আপনি যতক্ষণ ভাবছেন ততক্ষণ এটি গ্রহণ করবে না এবং এটি কোনও ইউনিকোড এইচটিএমএল দ্বারা প্রতিস্থাপন করবে।

অবশ্যই যদি আপনি JSON এ ফিরে আসা ইউনিকোড প্রকারগুলি জানেন তবে এটি হ্রাস করা যেতে পারে।

উদাহরণস্বরূপ আমার কোডটি প্রচুর তীর এবং ডিংব্যাট ইউনিকোড পাচ্ছিল। এগুলি 8448 এ 11263 এর মধ্যে So

$i=11263;
while($i>08448){
    ...etc...

আপনি এখানে টাইপ করে ইউনিকোডের ব্লকগুলি সন্ধান করতে পারেন: http://unicode-table.com/en/ আপনি যদি জানেন যে আপনি আরবি বা টেলিগু বা অন্য যে কোনও কিছু অনুবাদ করছেন তবে আপনি কেবল এই কোডগুলি প্রতিস্থাপন করতে পারবেন, সমস্ত 65,000 নয়।

আপনি সাধারণ এনকোডিংয়ে এই একই স্লেজহ্যামার প্রয়োগ করতে পারেন:

 $str=str_replace("\u$hex",chr($i),$str);

1

এছাড়াও একটি সমাধান রয়েছে:
http://www.welefen.com/php-unicode-to-utf8.html

function entity2utf8onechar($unicode_c){
    $unicode_c_val = intval($unicode_c);
    $f=0x80; // 10000000
    $str = "";
    // U-00000000 - U-0000007F:   0xxxxxxx
    if($unicode_c_val <= 0x7F){         $str = chr($unicode_c_val);     }     //U-00000080 - U-000007FF:  110xxxxx 10xxxxxx
    else if($unicode_c_val >= 0x80 && $unicode_c_val <= 0x7FF){         $h=0xC0; // 11000000
        $c1 = $unicode_c_val >> 6 | $h;
        $c2 = ($unicode_c_val & 0x3F) | $f;
        $str = chr($c1).chr($c2);
    } else if($unicode_c_val >= 0x800 && $unicode_c_val <= 0xFFFF){         $h=0xE0; // 11100000
        $c1 = $unicode_c_val >> 12 | $h;
        $c2 = (($unicode_c_val & 0xFC0) >> 6) | $f;
        $c3 = ($unicode_c_val & 0x3F) | $f;
        $str=chr($c1).chr($c2).chr($c3);
    }
    //U-00010000 - U-001FFFFF:  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    else if($unicode_c_val >= 0x10000 && $unicode_c_val <= 0x1FFFFF){         $h=0xF0; // 11110000
        $c1 = $unicode_c_val >> 18 | $h;
        $c2 = (($unicode_c_val & 0x3F000) >>12) | $f;
        $c3 = (($unicode_c_val & 0xFC0) >>6) | $f;
        $c4 = ($unicode_c_val & 0x3F) | $f;
        $str = chr($c1).chr($c2).chr($c3).chr($c4);
    }
    //U-00200000 - U-03FFFFFF:  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    else if($unicode_c_val >= 0x200000 && $unicode_c_val <= 0x3FFFFFF){         $h=0xF8; // 11111000
        $c1 = $unicode_c_val >> 24 | $h;
        $c2 = (($unicode_c_val & 0xFC0000)>>18) | $f;
        $c3 = (($unicode_c_val & 0x3F000) >>12) | $f;
        $c4 = (($unicode_c_val & 0xFC0) >>6) | $f;
        $c5 = ($unicode_c_val & 0x3F) | $f;
        $str = chr($c1).chr($c2).chr($c3).chr($c4).chr($c5);
    }
    //U-04000000 - U-7FFFFFFF:  1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    else if($unicode_c_val >= 0x4000000 && $unicode_c_val <= 0x7FFFFFFF){         $h=0xFC; // 11111100
        $c1 = $unicode_c_val >> 30 | $h;
        $c2 = (($unicode_c_val & 0x3F000000)>>24) | $f;
        $c3 = (($unicode_c_val & 0xFC0000)>>18) | $f;
        $c4 = (($unicode_c_val & 0x3F000) >>12) | $f;
        $c5 = (($unicode_c_val & 0xFC0) >>6) | $f;
        $c6 = ($unicode_c_val & 0x3F) | $f;
        $str = chr($c1).chr($c2).chr($c3).chr($c4).chr($c5).chr($c6);
    }
    return $str;
}
function entities2utf8($unicode_c){
    $unicode_c = preg_replace("/\&\#([\da-f]{5})\;/es", "entity2utf8onechar('\\1')", $unicode_c);
    return $unicode_c;
}

1

জেসন মানগুলি ঠিক করুন, এটি আপনার {xxx} এর আগে + যুক্ত করুন ""

  $item = preg_replace_callback('/"(.+?)":"(u.+?)",/', function ($matches) {
        $matches[2] = preg_replace('/(u)/', '\u', $matches[2]);
            $matches[2] = preg_replace('/(")/', '&quot;', $matches[2]); 
            $matches[2] = json_decode('"' . $matches[2] . '"'); 
            return '"' . $matches[1] . '":"' . $matches[2] . '",';
        }, $item);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.