복붙노트

"<! DOCTYPE>"전에 여러 UTF-8 BOM 시퀀스를 제거하는 방법?

PHP

""전에 여러 UTF-8 BOM 시퀀스를 제거하는 방법?

PHP5 (cgi)를 사용하여 파일 시스템에서 템플릿 파일을 출력하고 원시 HTML이 튀어 나오는 문제.

private function fetch($name) {
    $path = $this->j->config['template_path'] . $name . '.html';
    if (!file_exists($path)) {
        dbgerror('Could not find the template "' . $name . '" in ' . $path);
    }
    $f = fopen($path, 'r');
    $t = fread($f, filesize($path));
    fclose($f);
    if (substr($t, 0, 3) == b'\xef\xbb\xbf') {
        $t = substr($t, 3);
    }
    return $t;
}

BOM 픽스를 추가 했음에도 불구하고 여전히 파이어 폭스를 수락하는 데 문제가 있습니다. http://ccb.in/jisti/ (그리고 체크 아웃하려면 http://ircb.in/jisti/home.html에서 던진 템플릿 파일)을 볼 수 있습니다.

이 문제를 어떻게 해결할 수 있습니까? o_o

해결법

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

    1.다음 코드를 사용하여 utf8 bom을 제거합니다.

    다음 코드를 사용하여 utf8 bom을 제거합니다.

    //Remove UTF8 Bom
    
    function remove_utf8_bom($text)
    {
        $bom = pack('H*','EFBBBF');
        $text = preg_replace("/^$bom/", '', $text);
        return $text;
    }
    
  2. ==============================

    2.시험:

    시험:

    // -------- read the file-content ----
    $str = file_get_contents($source_file); 
    
    // -------- remove the utf-8 BOM ----
    $str = str_replace("\xEF\xBB\xBF",'',$str); 
    
    // -------- get the Object from JSON ---- 
    $obj = json_decode($str); 
    

    :)

  3. ==============================

    3.Unicode 코드 포인트 U + FEFF 인 BOM을 제거하는 또 다른 방법

    Unicode 코드 포인트 U + FEFF 인 BOM을 제거하는 또 다른 방법

    $str = preg_replace('/\x{FEFF}/u', '', $file);
    
  4. ==============================

    4.b '\ xef \ xbb \ xbf'는 리터럴 문자열 "\ xef \ xbb \ xbf"를 나타냅니다. BOM을 확인하려면 큰 따옴표를 사용해야하므로 \ x 시퀀스는 실제로 바이트로 해석됩니다.

    b '\ xef \ xbb \ xbf'는 리터럴 문자열 "\ xef \ xbb \ xbf"를 나타냅니다. BOM을 확인하려면 큰 따옴표를 사용해야하므로 \ x 시퀀스는 실제로 바이트로 해석됩니다.

    "\xef\xbb\xbf"
    

    파일에는 단순한 선도적 인 BOM보다 많은 쓰레기가 포함되어있는 것처럼 보입니다.

    $ curl http://ircb.in/jisti/ | xxd
    
    0000000: efbb bfef bbbf efbb bfef bbbf efbb bfef  ................
    0000010: bbbf efbb bf3c 2144 4f43 5459 5045 2068  .....<!DOCTYPE h
    0000020: 746d 6c3e 0a3c 6874 6d6c 3e0a 3c68 6561  tml>.<html>.<hea
    ...
    
  5. ==============================

    5.이 전역 함수는 UTF-8 시스템 기본 문자 세트를 해결합니다. 탱크!

    이 전역 함수는 UTF-8 시스템 기본 문자 세트를 해결합니다. 탱크!

    function prepareCharset($str) {
    
        // set default encode
        mb_internal_encoding('UTF-8');
    
        // pre filter
        if (empty($str)) {
            return $str;
        }
    
        // get charset
        $charset = mb_detect_encoding($str, array('ISO-8859-1', 'UTF-8', 'ASCII'));
    
        if (stristr($charset, 'utf') || stristr($charset, 'iso')) {
            $str = iconv('ISO-8859-1', 'UTF-8//TRANSLIT', utf8_decode($str));
        } else {
            $str = mb_convert_encoding($str, 'UTF-8', 'UTF-8');
        }
    
        // remove BOM
        $str = urldecode(str_replace("%C2%81", '', urlencode($str)));
    
        // prepare string
        return $str;
    }
    
  6. ==============================

    6.동일한 작업을 수행하는 추가 방법 :

    동일한 작업을 수행하는 추가 방법 :

    function remove_utf8_bom_head($text) {
        if(substr(bin2hex($text), 0, 6) === 'efbbbf') {
            $text = substr($text, 3);
        }
        return $text;
    }
    

    내 발견 한 다른 방법은 내 경우에는 작동하지 않습니다.

    그것이 특별한 경우에 도움이되기를 바랍니다.

  7. ==============================

    7.file_get_contents를 사용하여 일부 API를 읽고 json_decode에서 설명 할 수없는 NULL이있는 경우 json_last_error ()의 값을 확인하십시오. file_get_contents에서 반환 된 값에 문자열을 검사 할 때 거의 보이지 않는 불필요한 BOM이있는 경우가 있지만 json_last_error ( JSON_ERROR_SYNTAX (4)를 반환합니다.

    file_get_contents를 사용하여 일부 API를 읽고 json_decode에서 설명 할 수없는 NULL이있는 경우 json_last_error ()의 값을 확인하십시오. file_get_contents에서 반환 된 값에 문자열을 검사 할 때 거의 보이지 않는 불필요한 BOM이있는 경우가 있지만 json_last_error ( JSON_ERROR_SYNTAX (4)를 반환합니다.

    >>> $json = file_get_contents("http://api-guiaserv.seade.gov.br/v1/orgao/all");
    => "\t{"orgao":[{"Nome":"Tribunal de Justi\u00e7a","ID_Orgao":"59","Condicao":"1"}, ...]}"
    >>> json_decode($json);
    => null
    >>>
    

    이 경우 첫 번째 3 바이트를 확인하십시오. BOM이 대부분의 설정에서 보이지 않기 때문에 반향은 유용하지 않습니다.

    >>> substr($json, 0, 3)
    => "  "
    >>> substr($json, 0, 3) == pack('H*','EFBBBF');
    => true
    >>>
    

    위의 행이 TRUE를 반환하면 간단한 테스트를 통해 문제를 해결할 수 있습니다.

    >>> json_decode($json[0] == "{" ? $json : substr($json, 3))
    => {#204
         +"orgao": [
           {#203
             +"Nome": "Tribunal de Justiça",
             +"ID_Orgao": "59",
             +"Condicao": "1",
           },
         ],
         ...
       }
    
  8. ==============================

    8.도움이 될 것입니다. 내 생각을 넓히려면 신경이 쓰이는 부분을 알려주십시오.

    도움이 될 것입니다. 내 생각을 넓히려면 신경이 쓰이는 부분을 알려주십시오.

    <?php
        //
        // labled TESTINGSTRIPZ.php
        //
    
        define('CHARSET', 'UTF-8');
    
        $stringy = "\xef\xbb\xbf\"quoted text\" ";
        $str_find_array    = array( "\xef\xbb\xbf");
        $str_replace_array = array(             '');
    
    
        $RESULT =
            trim(
                mb_convert_encoding(
    
                    str_replace(
                        $str_find_array,
                        $str_replace_array,
                        strip_tags( $stringy )
                        ),
    
                    'UTF-8',
    
                    mb_detect_encoding(
                        strip_tags($stringy)
                        )
    
                    )
                );
    
            print("YOUR RESULT IS: " . $RESULT.PHP_EOL);
    
    ?>
    

    결과:

    terminal$ php TESTINGSTRIPZ.php 
          YOUR RESULT IS: "quoted text" // < with no hidden char.
    
  9. ==============================

    9.csv 가져 오기를 사용하는 사람이 다음 코드를 유용하면

    csv 가져 오기를 사용하는 사람이 다음 코드를 유용하면

               $header = fgetcsv($handle);
                foreach($header as $key=> $val) {
                    $bom = pack('H*','EFBBBF');
                    $val = preg_replace("/^$bom/", '', $val);
                    $header[$key] = $val;
                }
    
  10. from https://stackoverflow.com/questions/10290849/how-to-remove-multiple-utf-8-bom-sequences-before-doctype by cc-by-sa and MIT license