"<! 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.다음 코드를 사용하여 utf8 bom을 제거합니다.
다음 코드를 사용하여 utf8 bom을 제거합니다.
//Remove UTF8 Bom function remove_utf8_bom($text) { $bom = pack('H*','EFBBBF'); $text = preg_replace("/^$bom/", '', $text); return $text; }
-
==============================
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.Unicode 코드 포인트 U + FEFF 인 BOM을 제거하는 또 다른 방법
Unicode 코드 포인트 U + FEFF 인 BOM을 제거하는 또 다른 방법
$str = preg_replace('/\x{FEFF}/u', '', $file);
-
==============================
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.이 전역 함수는 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.동일한 작업을 수행하는 추가 방법 :
동일한 작업을 수행하는 추가 방법 :
function remove_utf8_bom_head($text) { if(substr(bin2hex($text), 0, 6) === 'efbbbf') { $text = substr($text, 3); } return $text; }
내 발견 한 다른 방법은 내 경우에는 작동하지 않습니다.
그것이 특별한 경우에 도움이되기를 바랍니다.
-
==============================
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.도움이 될 것입니다. 내 생각을 넓히려면 신경이 쓰이는 부분을 알려주십시오.
도움이 될 것입니다. 내 생각을 넓히려면 신경이 쓰이는 부분을 알려주십시오.
<?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.csv 가져 오기를 사용하는 사람이 다음 코드를 유용하면
csv 가져 오기를 사용하는 사람이 다음 코드를 유용하면
$header = fgetcsv($handle); foreach($header as $key=> $val) { $bom = pack('H*','EFBBBF'); $val = preg_replace("/^$bom/", '', $val); $header[$key] = $val; }
from https://stackoverflow.com/questions/10290849/how-to-remove-multiple-utf-8-bom-sequences-before-doctype by cc-by-sa and MIT license
'PHP' 카테고리의 다른 글
Woocommerce 3에서 주문 항목 및 WC_Order_Item_Product 가져 오기 (0) | 2018.09.12 |
---|---|
"경고 : 헤더 정보를 수정할 수 없습니다 - 이미 보낸 헤더"error [duplicate] (0) | 2018.09.12 |
두 날짜 비교 (0) | 2018.09.12 |
PostgreSQL 테이블 이름을 단순히 사용할 수 없습니다 ( "관계가 없습니다"). (0) | 2018.09.12 |
MySQL의 쿼리를 CSV로 변환하는 PHP 코드 [닫기] (0) | 2018.09.12 |