gpt4 book ai didi

php - 通过 PHP 使用 XSLT 的 UTF-8 编码问题

转载 作者:行者123 更新时间:2023-12-02 06:24:17 25 4
gpt4 key购买 nike

在通过 PHP 通过 XSLT 转换 XML 时,我遇到了一个令人讨厌的编码问题。

问题可以总结/简化如下:当我用 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&#239;&#223;&#960;&#955;&#509; &#145;special characters&#146;</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 文档中的所有字符都正常显示,除了 ‘和’字符实体(它们打开和关闭单引号)。我不是 Unicode 专家,但有两件事让我印象深刻:

  1. 所有其他字符实体都被正确解释(这可能暗示了 ‘’ 的 UTF-8 特性)
  2. 然而,当 XHTML 文件直接显示时(例如通过 http://localhost/encoding_test/encoding_test.php?bypass=true ),所有字符都可以正确显示。

我想我已经尽可能地为输出声明了 UTF-8 编码。其他人是否可能看到问题所在并可以纠正?

提前致谢!

罗恩范登布兰登

最佳答案

‘’ 是不可见的 Unicode 字符。

它们是单引号的旧 HTML 字符引用1,但是当您使用 XSLT 处理器处理它们时,处理器看不到单引号,而是十进制代码 145 和 146 的 Unicode 字符,即U+0090 and U+0091 .

这些字符是私有(private)使用的(即,Unicode 联盟未定义该用法)C1 control codes .

解决方案是使用正确的 Unicode 字符

1实际上,这些是映射到Windows-1252的代码编码。它们由浏览器显示,但实际上是 not valid in HTML :

NOTE -- the above SGML declaration, like that of HTML 2.0, specifies the character numbers 128 to 159 (80 to 9F hex) as UNUSED. This means that numeric character references within that range (e.g. ’) are illegal in HTML. Neither ISO 8859-1 nor ISO 10646 contain characters in that range, which is reserved for control characters.

关于php - 通过 PHP 使用 XSLT 的 UTF-8 编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3666606/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com