рдпреВрдирд┐рдХреЛрдб 6 рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде php рдкрд░ Utf-8 json рдЬрдирд░реЗрдЯрд░

рдмреЗрд╢рдХ, PHP рдореЗрдВ рдПрдХ рд╢рд╛рдирджрд╛рд░ json_encode рдлрд╝рдВрдХреНрд╢рди рд╣реИред рд▓реЗрдХрд┐рди рд╕рдВрд╕реНрдХрд░рдг 5.3 рд╕рдорд╛рд╡реЗрд╢реА рд╣реЛрдиреЗ рддрдХ, рдПрдХ рд╣реА рд░реВрд╕реА рдЕрдХреНрд╖рд░ \ uXXXX рдХреЗ рд░реВрдк рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ - рдХрдИ рдмрд╛рд░ utf-8 рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХред рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпреВ-рд╕реАрдХреНрд╡реЗрдВрд╕ рдореЗрдВ utf-8 рд╡рд░реНрдг рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рд╣рдЯрд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╣рд╛рдВ, PHP 5.4 рдореЗрдВ, json_encode рдХреЛ рдЖрдЦрд┐рд░рдХрд╛рд░ JSON_UNESCAPED_UNICODE рдкреИрд░рд╛рдореАрдЯрд░ рдорд┐рд▓рд╛, рд▓реЗрдХрд┐рди рдХрдИ рд╣реЛрд╕реНрдЯрд░реНрд╕ рдЕрднреА рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХреЗрд╡рд▓ 5.2 рдФрд░ 5.3 рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред

рдореИрдВ рджреВрд╕рд░реА рдмрд╛рдЗрдХ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдЬреЛ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ, рдЙрдирдореЗрдВ рдПрдХ рдЖрдо рд╕рдорд╕реНрдпрд╛ рд╣реИ - рд╡реЗ рдХреЗрд╡рд▓ рдпреВрдирд┐рдХреЛрдб рдмреЗрд╕ рдкреНрд▓реЗрди рдХреЗ рдкреНрд░рддреАрдХреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рд╡рд┐рдзрд┐, рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╢реЛрдзрдиреЛрдВ рдореЗрдВ, рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдлреИрд▓реА рд╣реБрдИ рд╣реИ, рдпрд╣ рд╣реИ рдХрд┐ json_encode рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдлрд╝рд┐рд▓реНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддрд╛ рд╣реИ рдЬреЛ utf-8 рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рд╛рде \ uXXXX рдХреА рд╕рднреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:

class Json{ static function json_encode($data){ return preg_replace_callback('/\\\\u([0-9a-f]{4})/i', function($val){ return mb_decode_numericentity('&#'.intval($val[1], 16).';', array(0, 0xffff, 0, 0xffff), 'utf-8'); }, json_encode($data) ); } } 

рдФрд░ рдЗрд╕ рдХреЛрдб рдиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ ... рддрдм рддрдХ, рдЬрдм рддрдХ рдпреВрдирд┐рдХреЛрдб рдЗрдореЛрдЬреА рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рдерд╛ (рдпреВрдирд┐рдХреЛрдб 6 рдорд╛рдирдХ рдореЗрдВ рдЗрдореЛрдЯрд┐рдХреЙрдиреНрд╕ рдЬреЛрдбрд╝реЗ рдЧрдП рдереЗ), рдЬрд┐рдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдореЗрдВ 0x1F000 (рдкрд╣рд▓реЗ рдпреВрдирд┐рдХреЛрдб рд╡рд┐рдорд╛рди) рд╕реЗ рдЕрдзрд┐рдХ рдХреЛрдб рд╣реИрдВред

рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ \ u- рдЕрдиреБрдХреНрд░рдо utf-16 рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд┐рдП рдЧрдП рд╣реИрдВ: 0x0000 рд╕реЗ 0xFFFF ("рд╡рд┐рдВрдбреЛ" 0xD800-0xDFFF рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдг (2 рдмрд╛рдЗрдЯреНрд╕) рдкреНрд░рддрд┐ рд╡рд░реНрдг рдФрд░ рдХреЛрдб рдХреЗ рд╕рд╛рде 2 рд╢рдмреНрдж (4 рдмрд╛рдЗрдЯреНрд╕) 0xD800-0xDFFF рдХреЗ рд▓рд┐рдП 0xFFFF рд╕реЗ рдЕрдзрд┐рдХ рдХреЛрдб рд╡рд╛рд▓реЗ рд╡рд░реНрдгред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдб 0x1f601 рдХреЗ рд╕рд╛рде рдореВрд▓ рдпреВрдирд┐рдХреЛрдб рд╡рд░реНрдг, utf-8 рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ "\ xf0 \ x9f \ x98 \ x81" рд╣реЛрдиреЗ рдкрд░, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП json_dencode рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ \ n ud83d \ ude01 "рдФрд░ рдЙрдкрд░реЛрдХреНрдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╕реНрдЯреНрд░рд┐рдВрдЧ" \ xed \ "рд╣реЛрдЧрд╛ред xa0 \ xbd \ xed \ xb8 \ x81 "ред рдПрдХ 4-рдмрд╛рдЗрдЯ рд╡рд░реНрдг рдХреЗ рдмрдЬрд╛рдп, рджреЛ 3-рдмрд╛рдЗрдЯ рд╡рд░реНрдг рдкреНрд░рд╛рдкреНрдд рд╣реБрдП рдереЗред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ 2 рдЪрд░рд┐рддреНрд░ \ u- рдЕрдиреБрдХреНрд░рдореЛрдВ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдкрд░рд┐рд╡рд░реНрддрди рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:

 class Json{ static public $_code; static public function json_encode($data){ Json::$_code=0; return preg_replace_callback('/\\\\u([0-9a-f]{4})/i', function($val){ $val=hexdec($val[1]); if(Json::$_code){ $val=((Json::$_code&0x3FF)<<10)+($val&0x3FF)+0x10000; Json::$_code=0; }elseif($val>=0xD800&&$val<0xE000){ Json::$_code=$val; return ''; } return html_entity_decode(sprintf('&#x%x;', $val), ENT_NOQUOTES, 'utf-8'); }, json_encode($data) ); } } 

рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдХрд┐рд╕реА рднреА utf-8 рдЕрдХреНрд╖рд░ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдкреАрдПрд╕ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдЗрд╖реНрдЯрддрдо рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ - рдкреНрд░рджрд░реНрд╢рдиред рдФрд░ рд╕рднреА рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдП рдЧрдП рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдЧрддрд┐ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдмрд╣реБрдд рдЖрд▓рд╕реА рд╣реИред рдпрд╣рд╛рдБ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИ:

 class Json{ static public function json_encode($data){ return preg_replace_callback('/\\\\ud([89ab][0-9a-f]{2})\\\\ud([cf][0-9a-f]{2})|\\\\u([0-9a-f]{4})/i', function($val){ return html_entity_decode( empty($val[3])? sprintf('&#x%x;', ((hexdec($val[1])&0x3FF)<<10)+(hexdec($val[2])&0x3FF)+0x10000): '&#x'.$val[3].';', ENT_NOQUOTES, 'utf-8' ); }, json_encode($data)); } } 

PPS HTML_entity_decode рдХреЙрд▓ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдбрд╛рд▓реА рдЬрд╛рддреА рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрд╕рд╛рдзрд┐рдд рдбреЗрдЯрд╛ рдореЗрдВ html рдХреЛрдб рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдЙрдкрдпреЛрдЧрд┐рддрд╛ HTML рдЗрдХрд╛рдЗрдпрд╛рдВ ('<', '>', 'рдФрд░', рдЖрджрд┐) рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╡рд░реНрдгреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред ред

Source: https://habr.com/ru/post/In195806/


All Articles