我喜欢用XML打印出特殊字符省略号“...”。如果是硬编码则可行。但是如果我从readdir()获得该字符。它不会起作用。为什么呢?
代码:
<?php
header('Content-Type: text/xml; charset=utf-8');
$maxnesting = 2;
echo "<root>";
initXMLDir("//somefolder");
function initXMLDir($target, $level = 0){
global $maxnesting;
$ignore = array("cgi-bin", ".", "..");
if(is_dir($target) && $level < $maxnesting){
if($dir = opendir($target)){
while (($file = readdir($dir)) !== false){
if(!in_array($file, $ignore)){
if(is_dir("$target/$file")){
echo "<object><name>".$file."</name>";
initXMLDir("$target/$file", ($level+1));
echo "</object>";
}
else{
echo "<object>".$file."</object>";
}
}
}
}
closedir($dir);
}
}
echo "</root>";
?>
如果我像这样对其进行硬编码并从文件名中删除该字符,则可以正常工作。
echo "<object>…".$file."…</object>";
它输出的错误是。
An invalid character was found in text content.
所以我的解决方案或解决方法来解决这个问题。通过结合这个功能,我找到了here
function xml_character_encode($string, $trans='') {
$trans=(is_array($trans)) ? $trans : get_html_translation_table(HTML_ENTITIES, ENT_QUOTES);
foreach ($trans as $k=>$v) $trans[$k]= "&#".ord($k).";";
return strtr($string, $trans);
}
和
iconv(mb_detect_encoding($file, "auto"), 'UTF-8', $file);
我解决了我的问题。所以基本上我首先编码所有字符,导致iconv()出现问题所以我可以安全地使用它。
所以像这样使用它:
$file= xml_character_encode($file);
$file= iconv(mb_detect_encoding($file, "auto"), 'UTF-8', $file);
我试图手动替换字符省略号,因为它似乎是唯一一个无法正确显示utf8_encode()和htmlspecialchars()的特殊字符(如果省略号显示正确,我只需要2个函数)用strtr()无法以某种方式完成。