我编写了一个小PHP脚本来编辑站点新闻XML文件。 我使用DOM来操纵XML(加载,写入,编辑)。PHP:将非英文字符写入XML - 编码问题
在编写英文字符时工作正常,但在编写非英文字符时,PHP在尝试加载文件时会引发错误。
如果我手动输入非英语字符到文件 - 它的加载完美的罚款,但如果PHP写的非英语字符,虽然我指定的UTF-8编码的编码出错。
任何帮助表示赞赏。
更新:与有用的答案,它解决了(阅读下文)。
错误:
警告:DOM文档::负载() [domdocument.load]:实体 '次' 不 在文件路径定义
警告:DOM文档::负载() [ domdocument.load]:输入不是 正确的UTF-8,表示编码! 字节:0x91值为0x26 0x74×69的文件路径
这里是负责加载和保存文件(不言自明)功能:
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()` - 我发现除了修复主要实体之外,它还可以打击一些非Unicode字符(即ASCII/1252等价)。 `str_replace()`通常更安全:) – 2010-12-22 10:35:19