পিএইচপি-তে এমন কোনও ফাংশন রয়েছে যা " \u00ed
" থেকে " í
" এর মতো ইউনিকোড পালানোর সিকোয়েন্সগুলি এবং অন্যান্য সমস্ত অনুরূপ ঘটনা ডিকোড করতে পারে ?
আমি একই প্রশ্ন পাওয়া এখানে কিন্তু কাজ বলে মনে হচ্ছে না।
উত্তর:
এটা চেষ্টা কর:
$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);
\u
চারটি হেক্সাডেসিমাল অঙ্কের পরে থাকা কোনও ক্রমের সাথে মিলবে ।
print_r(json_decode('{"t":"\u00ed"}')); // -> stdClass Object ( [t] => í )
json_decode('"' . $text . '"')
json_decode('{"t":"\uD83D\uDE0A"}')
$text
ডাবল উক্তি অন্তর্ভুক্ত করতে পারে এমন তথ্যটি আপনার অন্তর্ভুক্ত করা উচিত । সুতরাং একটি সংশোধিত সংস্করণ হতে হবে: json_decode('"'.str_replace('"', '\\"', $text).'"')
। আপনার সাহায্যের :-) জন্য ধন্যবাদ
পিএইচপি of হিসাবে, আপনি এটি করতে ইউনিকোড কোডপয়েন্ট পলায়ন সিনট্যাক্স ব্যবহার করতে পারেন ।
echo "\u{00ed}";
আউটপুট í
।
$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);
}
😍
এইচটিএমএল দিয়ে কাঁচা ইউনিকোডে প্রতিস্থাপন করার জন্য এটি একটি স্লেজহ্যামার পদ্ধতি। আমি এই সমাধানটি দেওয়ার জন্য অন্য কোনও জায়গা দেখিনি, তবে আমি ধরে নিয়েছি অন্যদেরও এই সমস্যা হয়েছে।
আর কিছু করার আগে এই আরআরপ্লেস ফাংশনটি 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);
এছাড়াও একটি সমাধান রয়েছে:
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;
}
জেসন মানগুলি ঠিক করুন, এটি আপনার {xxx} এর আগে + যুক্ত করুন ""
$item = preg_replace_callback('/"(.+?)":"(u.+?)",/', function ($matches) {
$matches[2] = preg_replace('/(u)/', '\u', $matches[2]);
$matches[2] = preg_replace('/(")/', '"', $matches[2]);
$matches[2] = json_decode('"' . $matches[2] . '"');
return '"' . $matches[1] . '":"' . $matches[2] . '",';
}, $item);