【问题标题】:HTML page <title> not interpreted as UTF-8 when using SSI使用 SSI 时 HTML 页面 <title> 未解释为 UTF-8
【发布时间】:2014-01-15 14:49:07
【问题描述】:

为了使我的网站外观和感觉一致,我大量使用 SSI。我所有的页面都有相同的页眉(标题除外)和页脚。这些行为类似于模板并包含在 SSI 指令中。通过 SSI #set-variables 提供变量字段内容。

这是我在不使用 HTML 生成器的情况下找到的最接近“函数”的等价物。

一个标准的页面结构如下:

<!--#set var="PageTitle" value="Référence" -->
<!--#include virtual="/header.shtml" -->
<section>
    Specific page content
</section>
<!--#include virtual="/footer.shtml" -->

文件header.shtml 包含&lt;!DOCTYPE &gt; &lt;html&gt; &lt;head&gt; ... &lt;/head&gt; &lt;&lt;body&gt; &lt;header&gt; ... &lt;/header&gt; 和类似的&lt;footer&gt; ... &lt;/footer&gt; &lt;/body&gt; &lt;/html&gt; footer.shtml

文件 header.shtml 用一个元素为页面创建标题:

<title><!--#echo var="PageTitle" --></title>

只要我的变量 PageTitle 的标题字符串只包含可打印的 ASCII 字符(即,只要我用英文书写),一切都很好。如果我想使用 ASCII 可打印集之外的字符插入任何语言的标题,事情就会变得更加复杂。

如果这个字符串放在&lt;title&gt;元素中,就没有问题。

例如,上面的法语单词打印为 Référence。 UTF-8 序列 \x52 \x53 \xA9 ... 像 ISO-8859-x 一样打印。 \x53 \xA9 是 \xC0 + \x29 = U+00E9 LATIN SMALL LETTER E WITH ACUTE 的 UTF-8 序列,这是所需的字符。

我尝试在#echo 指令中使用一些encoding= 属性,但无济于事,因为它会影响ISO-8859-1 特殊字符并且似乎无法理解UTF-8。

从我在服务器发送的 HTML 中看到的,该字符串使用实体引用来表示任何“可疑”字符:

R&#195;&#169;f&#195;&#169;rence

有没有办法将 Apache SSI #echo 处理置于“透明”模式?

Apache 手册说 encoding= 默认为 entity (我得到了结果)。它也可以设置为URL 以保护 URL 免受恶意使用(即 % 转义)。但是,没有none 设置。

当然,作为一种解决方法,我可以直接在字符串中使用字符实体引用,但这对用户不友好:键入可从键盘访问的字符并具有屏幕上的目标字符便于校对。

编辑:

解决了!

已解决,但不知道是不是“标准”。

我尝试在有问题的#echo 语句中添加encoding="none",一切正常!

现在,我必须检查这是否适用于不同的 Apache 版本。

【问题讨论】:

  • 如何检查浏览器收到的 HTML?旧的“查看源代码”功能显示实际文本,但任何更高级的(尤其是显示 DOM 树的开发人员工具)都不会。而且,浏览器应该如何知道您的文本是 UTF-8?您没有提及任何有关 HTTP 标头的内容。
  • 我没有提到所有的簿记;网站的“手动”和 SSI 版本中的所有内容都是相同的(“Content-Type: text/html;charset=utf-8”的 HTTP 标头在页面文本之前显式发送)。 Unicode UTF-8 字节序列 -> 在#echo 处理期间发生实体引用(以保护我免受意外 XSS 的影响)。我想暂时禁用这个转换。
  • 请使用“回答您自己的问题”按钮提供解决方案。否则,答案将无法投票或接受,问题将显示为未回答。
  • 我知道,但我的“声誉”不允许我回答自己的问题。我考虑添加一条新评论,但决定改为编辑我的问题。也许您可以将我的编辑复制为已解决的答案?问候。

标签: apache unicode character-encoding echo ssi


【解决方案1】:

我添加了这个答案,因为上面的答案并没有完全为我解决:

确保 echo 语句使用 encoding="none" -- 并且确保将其设置在 var 之前而不是之后。

由于某种原因,这可行:

&lt;!--#echo encoding="none" var="pageTitle" --&gt;

但事实并非如此:

&lt;!--#echo var="pageTitle" encoding="none" --&gt;

【讨论】:

  • 是的,我注意到编码选项必须放在第一位。感谢您明确限制条件和您的回答。
【解决方案2】:

缺少竖线/竖线。

我还没有阅读整个页面,所以不确定这是否是您问题的真正原因,但如果您正在使用它,则需要纠正它。

【讨论】:

  • 你是对的,每个代码 sn-p 中都缺少感叹号。我很抱歉这个错字。这不是问题的原因:我没有粘贴代码,而是全部重新输入,忘记了感叹号。我将编辑问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多