當通過PHP通過XSLT轉換XML時,我正面臨一個討厭的編碼問題。通過PHP使用XSLT的UTF-8編碼問題
這個問題可以概括如下:當我用XSLT樣式表複製一個(UTF-8編碼的)XHTML文件時,某些字符顯示錯誤。當我只顯示相同的XHTML文件時,所有字符都正確顯示。
以下文件說明問題:
XHTML<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>encoding test</title>
</head>
<body>
<p>This is how we dïßπλǽ ‘special characters’</p>
</body>
</html>
XSLT
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" encoding="UTF-8"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
PHP
<?php
$xml_file = 'encoding_test.xml';
$xsl_file = 'encoding_test.xsl';
$xml_doc = new DOMDocument('1.0', 'utf-8');
$xml_doc->load($xml_file);
$xsl_doc = new DOMDocument('1.0', 'utf-8');
$xsl_doc->load($xsl_file);
$xp = new XsltProcessor();
$xp->importStylesheet($xsl_doc);
// alllow to bypass XSLT transformation with bypass=true request parameter
if ($bypass = $_GET['bypass']) {
echo file_get_contents($xml_file);
}
else {
echo $xp->transformToXML($xml_doc);
}
?>
當這個腳本調用本身(例如通過http://localhost/encoding_test/encoding_test.php),轉換後的XHTML文檔中的所有字符都沒問題,除了&#145;和&#146;字符實體(它們打開和關閉單引號)。我不是一個Unicode專家,但兩件事情打我:
- 所有其它字符實體正確(這可能意味着一些有關
‘
的UTF-8的煩躁和’
)解釋 - 然而,當XHTML文件顯示不中介(通過例如http://localhost/encoding_test/encoding_test.php?bypass=true),全部字符顯示正確。
我想我已經在任何地方聲明瞭UTF-8編碼。別人可能會看到有什麼不對,並可能被糾正?
在此先感謝!
羅恩·範登布蘭登
+1很好的解釋!同樣適用於其他字形的參考文獻http://en.wikipedia.org/wiki/Quotation_mark_glyphs – 2010-09-08 13:09:11
HTML 5草案更進一步:「上述數字字符參考表單允許引用除U + 0000,U + 000D,永久未定義的Unicode字符(非字符)以及空格字符以外的控制字符。「 – Artefacto 2010-09-08 13:19:22
唷,非常感謝!除了清楚的解釋之外,您非常樂意提供有用的解決方案。 – rvdb 2010-09-08 13:53:25