복붙노트

"\ u00ed"와 같은 유니 코드 이스케이프 시퀀스를 올바른 UTF-8 인코딩 문자로 디코딩하는 방법?

PHP

"\ u00ed"와 같은 유니 코드 이스케이프 시퀀스를 올바른 UTF-8 인코딩 문자로 디코딩하는 방법?

PHP에서 "\ u00ed"와 "í"같은 유니 코드 이스케이프 시퀀스를 디코딩 할 수있는 함수가 있습니까?

나는 여기에 비슷한 질문을 발견했지만 작동하지 않는 것 같습니다.

해결법

  1. ==============================

    1.

    이 시도:

    $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);
    

    UTF-16 기반 C / C ++ / Java / Json 스타일의 경우 :

    $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);
    
  2. ==============================

    2.

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

    3.

    $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);
    }
    
  4. ==============================

    4.

    PHP 7부터 유니 코드 코드 포인트 이스케이프 구문을 사용하여이를 수행 할 수 있습니다.

    echo "\ u {00ed}"; 출력.

  5. ==============================

    5.

    이것은 원시 UNICODE를 HTML로 바꾸는 데있어 큰 실수입니다. 나는이 솔루션을 넣을 다른 곳을 보지 못했지만 다른 사람들이이 문제를 가지고 있다고 가정합니다.

    무엇이든하기 전에이 str_replace 함수를 RAW JSON에 적용하십시오. 그밖에.

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

    생각만큼 오래 걸리지 않을 것이고 이것은 유니 코드를 HTML로 대체 할 것입니다.

    물론 JSON에서 반환되는 유니 코드 유형을 아는 경우이 값을 줄일 수 있습니다.

    예를 들어, 제 코드는 많은 화살표와 dingbat 유니 코드를 얻고있었습니다. 이것들은 8448에서 11263 사이입니다. 따라서 제 제작 코드는 다음과 같습니다 :

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

    여기에 유니 코드 블록을 입력 할 수 있습니다. http://unicode-table.com/en/ 아랍어 또는 Telegu 또는 다른 언어로 번역하는 경우 65,000 개가 아닌 해당 코드를 바꿀 수 있습니다.

    간단한 인코딩에이 같은 쇠망 치를 적용 할 수 있습니다.

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

    6.

    또한 해결 방법이 있습니다. 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;
    }
    
  7. ==============================

    7.

    json 값을 수정하고,  그것은 모든 \ ""에 \ {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);
    
  8. from https://stackoverflow.com/questions/2934563/how-to-decode-unicode-escape-sequences-like-u00ed-to-proper-utf-8-encoded-cha by cc-by-sa and MIT lisence