>  기사  >  백엔드 개발  >  HTML을 로드할 때 DOMDocument가 UTF-8 문자를 올바르게 처리하지 못하는 이유는 무엇입니까?

HTML을 로드할 때 DOMDocument가 UTF-8 문자를 올바르게 처리하지 못하는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-04 10:12:30468검색

Why does DOMDocument fail to handle UTF-8 characters correctly when loading HTML?

DOMDocument에서 UTF-8 문자를 처리할 수 없음

웹 서버가 UTF-8 인코딩으로 응답을 전송하는 시나리오에서 모든 파일은 마찬가지로 UTF-8로 저장되었고 모든 관련 설정이 UTF-8 인코딩으로 구성되어 있으면 문제가 발생합니다. 출력 기능을 검증하기 위해 설계된 테스트 프로그램은 불규칙한 동작을 보여줍니다.

프로그램 실행 시 출력은 다음과 같이 렌더링됩니다.

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>Test!</title></head><body>
    <h1>☆ Hello ☆ World ☆</h1>    
</body></html>

다음과 같이 표시됩니다.

< ;h1>â~† Hello â~† World â~†


프로그램:

<code class="php">$html = <<<HTML
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>Test!</title>
</head>
<body>
    <h1>☆ Hello ☆ World ☆</h1>
</body>
</html>
HTML;

$dom = new DOMDocument("1.0", "utf-8");
$dom->loadHTML($html);

header("Content-Type: text/html; charset=utf-8");
echo($dom->saveHTML());</code>

원인

근본적인 원인은 DOMDocument::loadHTML()이 HTML 형식의 문자열을 예상하기 때문입니다. HTML은 본질적으로 ISO-8859-1(ISO 라틴 알파벳 No. 1)을 기본 문자 인코딩으로 활용합니다. 결과적으로 HTML 4.0용으로 설계된 HTML 파서가 이 인코딩을 초과하는 문자를 발견하면 예측할 수 없는 동작을 보일 수 있습니다.

해결책

비ASCII 문자를 엔터티로 변환

이 문제를 해결하려면 ASCII 범위(127/h7F)를 벗어난 모든 문자를 HTML 엔터티로 변환해야 합니다. 이 프로세스는 HTML-ENTITIES 대상 인코딩과 함께 mb_convert_encoding을 사용하여 달성할 수 있습니다:

<code class="php">$html = mb_convert_encoding($html, "HTML-ENTITIES", "UTF-8");</code>

콘텐츠 유형 메타 태그 추가

또는 다음 방법으로 문제를 해결할 수 있습니다. 문자 세트를 UTF-8로 지정하여 문서 자체에 태그를 지정합니다.

<code class="html"><meta http-equiv="content-type" content="text/html; charset=utf-8"></code>

이 메서드는 DOMDocument에 대한 힌트 역할을 하여 입력을 UTF-8 인코딩으로 해석하도록 강제합니다. 섹션에서 HTML 2.0 사양에 따르면 이러한 요소는 헤더 내에서 자동으로 재배치됩니다.

위 내용은 HTML을 로드할 때 DOMDocument가 UTF-8 문자를 올바르게 처리하지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.