사이트 뉴스 XML 파일을 편집하기 위해 작은 PHP 스크립트를 작성했습니다. DOM을 사용하여 XML (로드, 쓰기, 편집)을 조작했습니다.PHP : 비 영어 문자를 XML 인코딩 문제로 작성
영어 문자를 쓸 때 잘 작동하지만 영어가 아닌 문자를 쓰면 PHP가 파일을로드 할 때 오류가 발생합니다.
비 영어 문자를 파일에 수동으로 입력하면 완벽하게로드되지만 완벽하지는 않지만 PHP에서 영어 이외의 문자를 쓰면 utf-8 인코딩을 지정했지만 인코딩이 잘못됩니다.
도움을 주시면 감사하겠습니다.
업데이트 : 유용한 답변과 함께 해결되었습니다 (아래 참조).
오류 :
경고 :있는 DOMDocument :: 부하() [domdocument.load] :: DOMDocument를 부하() [: 엔티티 타임즈하지 은 파일 경로에
경고 정의 domdocument.load] : 입력이 이 아니라 올바른 UTF-8 인코딩을 나타냅니다! 바이트 : 0x91 0x26 따라 0x74 0x69에서 파일 경로
다음
로드하고 파일을 저장 (자명)을 담당하는 기능은 다음과 같습니다 여기
function get_tags_from_xml(){
// Load news entries from XML file for display
$errors = Array();
if(!$xml_file = load_news_file()){
// Load file
// String indicates error presence
$errors = "file not found";
return $errors;
}
$taglist = $xml_file->getElementsByTagName("text");
return $taglist;
}
function set_news_lang(){
// Sets the news language
global $news_lang;
if($_POST["news-lang"]){
$news_lang = htmlentities($_POST["news-lang"]);
}
elseif($_GET["news-lang"]){
$news_lang = htmlentities($_GET["news-lang"]);
}
else{
$news_lang = "he";
}
}
function load_news_file(){
// Load XML news file for proccessing, depending on language
global $news_lang;
$doc = new DOMDocument('1.0','utf-8');
// Create new XML document
$doc->load("news_{$news_lang}.xml");
// Load news file by language
$doc->formatOutput = true;
// Nicely format the file
return $doc;
}
function save_news_file($doc){
// Save XML news file, depending on language
global $news_lang;
$doc->saveXML($doc->documentElement);
$doc->save("news_{$news_lang}.xml");
}
XML로 작성하기위한 코드입니다 (뉴스 추가) :
<?php ob_start()?>
<?php include("include/xml_functions.php")?>
<?php include("../include/functions.php")?>
<?php get_lang();?>
<?php
//TODO: ADD USER AUTHENTICATION!
if(isset($_POST["news"]) && isset($_POST["news-lang"])){
set_news_lang();
$news = htmlentities($_POST["news"]);
$xml_doc = load_news_file();
$news_list = $xml_doc->getElementsByTagName("text");
// Get all existing news from file
$doc_root_element = $xml_doc->getElementsByTagName("news")->item(0);
// Get the root element of the new XML document
$new_news_entry = $xml_doc->createElement("text",$news);
// Create the submited news entry
$doc_root_element->appendChild($new_news_entry);
// Append submited news entry
$xml_doc->appendChild($doc_root_element);
save_news_file($xml_doc);
header("Location: /cpanel/index.php?lang={$lang}&news-lang={$news_lang}");
}
else{
header("Location: /cpanel/index.php?lang={$lang}&news-lang={$news_lang}");
}
?>
<?php ob_end_flush()?>
업데이트 : 사용자가 제공 한 도움이 대답과의 해결 : 형식에 의해 제출 된 값은 영어가 아닌이며, 일부 HTML 엔티티를 포함, POST에서 htmlentities()
을 사용했기 때문에 영어가 아닌 문자열을 읽을 수 없습니다. htmlentities()
을 htmlspecialchars()
으로 대체했으며 마술처럼 작동합니다.
결론 : htmlentities()
영어가 아닌 문자열을 망칠 수 있습니다.
'htmlspecialchars()'와 조심하십시오 - 주체를 수정하는 것 외에도 비 유니 코드 문자 (즉, ASCII/1252 등가물)를 비트 주변에 넣을 수도 있습니다. 'str_replace()'는 보통 더 안전합니다 :) –