PHP:将非英语字符写入XML编码问题
我写了一个小的PHP脚本来编辑站点新闻XML文件。
我使用DOM来操作XML(加载,编写,编辑)。
它在写英文字符时工作正常,但是当写入非英文字符时,PHP在尝试加载文件时会抛出错误。
如果我在文件中手动输入非英文字符 - 它的加载完全正常,但如果PHP写入非英文字符,则编码出错,尽管我指定了utf-8编码。
任何帮助表示赞赏。
更新:有用的答案,它解决了(见下文)。
错误:
警告:DOMDocument :: load()
[domdocument.load]:实体'时代'没有
在filepath中定义
警告:DOMDocument :: load()
[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()
可以破坏非英语字符串。
没有找到相关结果
已邀请:
2 个回复
栖很钾是狠
联海
这样的HTML实体。保证工作的唯一实体是
,
,
和
。 请改用数字实体。因此,对于&times;,请使用
等。 这是您拨打
后可以添加的快速而肮脏的技巧:
你可以用
和
做更好的事情,但这是你需要的数据。 或者,如果性能对您来说是一个问题,您可以执行一些奇特的多字节字符检测并完全绕过命名实体步骤。 PHP网站上有很多例子。 严格来说,如果您已将XML文档标记为utf8编码,则可以完全保留实体编码,并对四个主要编码进行编码:
ñ。