오늘 CSDN에서 PHP에서 보이지 않는 공백 문자 65279를 출력하는 데 문제가 있는 것을 보았습니다. 인터넷에서 찾아보니 65279 문자가 PHP에서 파일을 UTF-8로 인코딩된 것으로 표시하는 데 사용되는 것을 발견했습니다. 클라이언트에 함께 출력되므로 ajax를 사용하여 반환 값을 가져올 때 클라이언트가 문자열을 일치시킬 수 없게 됩니다.
php 보이지 않는 문자 65279는 다음과 같이 설명됩니다.
UTF-8로 인코딩된 파일은 BOM 없음과 BOM의 두 가지 형식으로 나눌 수 있습니다.
BOM이란?
"EF BB BF" 이 3바이트를 BOM이라고 하며, 전체 이름은 "Byte Order Mard"입니다. BOM은 일반적으로 utf8 파일에서 파일이 UTF-8 파일임을 나타내기 위해 사용되며 BOM의 원래 의도는 utf16에서 사용되는 것입니다.
PHP에서 UTF-8 파일을 출력하면 BOM도 출력되기 때문에 PHP에서 UTF-8을 사용하려면 BOM 헤더가 없는 UTF-8 파일을 사용해야 합니다.
일반적으로 사용되는 텍스트 편집 소프트웨어는 UTF-8 파일을 저장하는 다양한 방법을 지원하므로 사용할 때 특히 주의해야 합니다.
예:
1. ultraedit를 사용할 때 저장 시 "UTF-8"과 "UTF-8 - BOM 없음"이라는 두 가지 옵션이 있습니다.
2. 창의 메모장에서 파일을 BOM과 함께 저장합니다.
3. EditPlus 소프트웨어 버전에 따라 UTF-8 저장에 대한 지원이 다릅니다. 예를 들어 버전 2.31은 BOM 없이 저장하고 버전 2.11은 BOM과 함께 저장합니다.
utf-8 파일 헤더를 제거하는 방법:
1. ultraedit를 사용하여 "UTF-8 - BOM 없음"으로 저장합니다.
2. 사이트의 루트 디렉토리에서 실행되는 매우 유용한 PHP 프로그램은 디렉토리에 있는 모든 UTF-8 파일의 BOM 헤더를 제거합니다.
//remove the utf-8 boms //by magicbug at gmail dot com if (isset($_GET['dir'])){ //config the basedir $basedir=$_GET['dir']; }else{ $basedir = '.'; } $auto = 1; checkdir($basedir); function checkdir($basedir){ if ($dh = opendir($basedir)) { while (($file = readdir($dh)) !== false) { if ($file != '.' && $file != '..'){ if (!is_dir($basedir."/".$file)) { echo "filename $basedir/$file ".checkBOM("$basedir/$file")." <br>"; }else{ $dirname = $basedir."/".$file; checkdir($dirname); } } } closedir($dh); } } function checkBOM ($filename) { global $auto; $contents = file_get_contents($filename); $charset[1] = substr($contents, 0, 1); $charset[2] = substr($contents, 1, 1); $charset[3] = substr($contents, 2, 1); if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191) { if ($auto == 1) { $rest = substr($contents, 3); rewrite ($filename, $rest); return ("<font color=red>BOM found, automatically removed.</font>"); } else { return ("<font color=red>BOM found.</font>"); } } else return ("BOM Not Found."); } function rewrite ($filename, $data) { $filenum = fopen($filename, "w"); flock($filenum, LOCK_EX); fwrite($filenum, $data); fclose($filenum); }