여러 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 수정을 추가했지만 Firefox가 이를 받아들이는 데 여전히 문제가 있습니다.라이브 카피는, 이쪽에서 보실 수 있습니다.http://ircb.in/jisti/ (또한 http://ircb.in/jisti/home.html에 투고한 템플릿 파일도 확인하실 수 있습니다.)
이걸 어떻게 고칠지 알아?o_o
다음 코드를 사용하여 utf8 bom을 제거합니다.
//Remove UTF8 Bom
function remove_utf8_bom($text)
{
$bom = pack('H*','EFBBBF');
$text = preg_replace("/^$bom/", '', $text);
return $text;
}
시험:
// -------- 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);
:)
Unicode 코드 포인트 U+FEF인 BOM을 삭제하는 다른 방법
$str = preg_replace('/\x{FEFF}/u', '', $file);
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
...
csv Import를 사용하는 사용자가 있다면 아래 코드가 유용합니다.
$header = fgetcsv($handle);
foreach($header as $key=> $val) {
$bom = pack('H*','EFBBBF');
$val = preg_replace("/^$bom/", '', $val);
$header[$key] = $val;
}
이 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;
}
없는 솔루션pack
기능:
$a = "1";
var_dump($a); // string(4) "1"
function deleteBom($text)
{
return preg_replace("/^\xEF\xBB\xBF/", '', $text);
}
var_dump(deleteBom($a)); // string(1) "1"
동일한 작업을 수행하기 위한 추가 방법:
function remove_utf8_bom_head($text) {
if(substr(bin2hex($text), 0, 6) === 'efbbbf') {
$text = substr($text, 3);
}
return $text;
}
제가 찾은 다른 방법들은 제 경우에는 효과가 없습니다.
특별한 경우에 도움이 되길 바랍니다.
나는 그것을 사용하는 것을 그다지 좋아하지 않는다.preg_replace
또는preg_match
간단한 작업에 사용합니다.BOM을 검출하여 제거하는 대체 방법은 어떻습니까?
function remove_utf8_bom(string $text): string
{
$bomStart = mb_substr($text, 0, 1);
return ($bomStart == pack('H*','EFBBBF')) ?
mb_substr($text, 1) :
$text;
}
API를 읽고 있는 경우file_get_contents
설명할 수 없는 일이 생겼다.NULL
부터json_decode
, 의 값을 확인합니다.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",
},
],
...
}
결함이 있는 소프트웨어를 사용할 경우 BOM 부품이 저장될 때마다 곱해지는 경우가 있습니다.
그래서 이걸 이용해서 없애고 있어요.
function remove_utf8_bom($text) {
$bom = pack('H*','EFBBBF');
while (preg_match("/^$bom/", $text)) {
$text = preg_replace("/^$bom/", '', $text);
}
return $text;
}
언급URL : https://stackoverflow.com/questions/10290849/how-to-remove-multiple-utf-8-bom-sequences
'source' 카테고리의 다른 글
HTML을 PHP "if" 스테이트먼트에 삽입할 수 있습니까? (0) | 2022.11.05 |
---|---|
MySQL이 ALTER 탭에 행업하다Leep. (0) | 2022.11.05 |
PHP의 숨겨진 기능 (0) | 2022.11.05 |
Reactor에서 예외를 설정하는 올바른 방법 (0) | 2022.11.05 |
포인터 투 포인트 슛은 C에서 어떻게 작동합니까? (그리고 언제 사용할 수 있습니까?) (0) | 2022.11.05 |