为了获得一个有效的最终 XML 文本,您需要转义所有 XML 实体,并以与 XML 文档处理指令所述相同的编码编写文本(<?xml 行中的“编码”) .重音字符不需要转义,只要编码为文档即可。
但是,在许多情况下,简单地用htmlspecialchars 转义输入可能会导致实体被双重编码(例如&amp;eacute; 会变成&amp;eacute;),所以我建议先解码html 实体:
function xml_escape($s)
{
$s = html_entity_decode($s, ENT_QUOTES, 'UTF-8');
$s = htmlspecialchars($s, ENT_QUOTES, 'UTF-8', false);
return $s;
}
现在您需要确保所有重音字符在 XML 文档编码中都是有效的。我强烈建议始终以 UTF-8 编码 XML 输出,因为并非所有 XML 解析器都尊重 XML 文档处理指令编码。如果您的输入可能来自不同的字符集,请尝试使用utf8_encode()。
有一种特殊情况,您的输入可能来自以下编码之一:ISO-8859-1、ISO-8859-15、UTF-8、cp866、cp1251、cp1252 和 KOI8-R——PHP 处理它们都一样,但它们之间有一些细微的差别——其中一些甚至iconv() 都无法处理。我只能通过补充utf8_encode() 行为来解决这个编码问题:
function encode_utf8($s)
{
$cp1252_map = array(
"\xc2\x80" => "\xe2\x82\xac",
"\xc2\x82" => "\xe2\x80\x9a",
"\xc2\x83" => "\xc6\x92",
"\xc2\x84" => "\xe2\x80\x9e",
"\xc2\x85" => "\xe2\x80\xa6",
"\xc2\x86" => "\xe2\x80\xa0",
"\xc2\x87" => "\xe2\x80\xa1",
"\xc2\x88" => "\xcb\x86",
"\xc2\x89" => "\xe2\x80\xb0",
"\xc2\x8a" => "\xc5\xa0",
"\xc2\x8b" => "\xe2\x80\xb9",
"\xc2\x8c" => "\xc5\x92",
"\xc2\x8e" => "\xc5\xbd",
"\xc2\x91" => "\xe2\x80\x98",
"\xc2\x92" => "\xe2\x80\x99",
"\xc2\x93" => "\xe2\x80\x9c",
"\xc2\x94" => "\xe2\x80\x9d",
"\xc2\x95" => "\xe2\x80\xa2",
"\xc2\x96" => "\xe2\x80\x93",
"\xc2\x97" => "\xe2\x80\x94",
"\xc2\x98" => "\xcb\x9c",
"\xc2\x99" => "\xe2\x84\xa2",
"\xc2\x9a" => "\xc5\xa1",
"\xc2\x9b" => "\xe2\x80\xba",
"\xc2\x9c" => "\xc5\x93",
"\xc2\x9e" => "\xc5\xbe",
"\xc2\x9f" => "\xc5\xb8"
);
$s=strtr(utf8_encode($s), $cp1252_map);
return $s;
}