← PHP fprintf()函数:格式化字符串写入流指南 PHP hebrev()函数教程:希伯来文视觉文本转换、maxcharline参数与经验 →

PHP get_html_translation_table()函数详解:翻译表、编码标志与避坑指南

著
原创 2026-10-10 PHP 已有人查阅

一、函数定位与核心作用

get_html_translation_table() 是 PHP 内置的字符串处理函数,返回一个数组形式的翻译表。这个表正是 htmlspecialchars() 和 htmlentities() 在转义特殊字符时实际使用的映射关系。数组的键是原始字符,值是对应的 HTML 实体形式。

特殊字符的编码方式不止一种。比如双引号可以写成 "、" 或 "。但 get_html_translation_table() 只返回 htmlspecialchars() 和 htmlentities() 所采用的那一种形式。这一点在调试转义结果或自定义转义逻辑时非常关键。

语法结构

get_html_translation_table(
    int $table = HTML_SPECIALCHARS,
    int $flags = ENT_COMPAT | ENT_HTML401,
    string $encoding = "UTF-8"
): array

返回值始终是数组。如果传入不支持的字符集,函数会发出警告并使用默认编码。

二、参数深度解析

1. table 参数

可选,决定返回哪张表。

  • HTML_SPECIALCHARS:仅包含特殊字符的翻译表,默认值。

  • HTML_ENTITIES:包含所有 HTML 实体的翻译表,范围更广。

2. flags 参数

位掩码,控制引号处理方式和文档类型。默认 ENT_COMPAT | ENT_HTML401。

引号相关标志

标志 含义
ENT_COMPAT 只转义双引号,不转义单引号
ENT_QUOTES 双引号和单引号都转义
ENT_NOQUOTES 两种引号都不转义

文档类型标志

标志 对应文档
ENT_HTML401 HTML 4.01
ENT_XML1 XML 1
ENT_XHTML XHTML
ENT_HTML5 HTML5

不同文档类型下,同一字符的实体形式可能不同。比如 HTML5 对某些字符的实体命名与 HTML 4.01 存在差异。

3. encoding 参数

指定字符编码。PHP 5.4.0 之前默认 ISO-8859-1,之后默认 UTF-8。支持的主要字符集包括:

  • ISO-8859-1、ISO-8859-5、ISO-8859-15

  • UTF-8

  • cp866、cp1251、cp1252

  • KOI8-R

  • BIG5、GB2312、BIG5-HKSCS

  • Shift_JIS、EUC-JP

  • MacRoman

空字符串会触发默认字符集检测,依次从 default_charset、脚本编码、当前区域设置中获取。不推荐使用空字符串,因为行为受环境影响,容易出现意外结果。

三、版本变更与兼容性

版本 变更内容
PHP 5.4.0 encoding 默认值改为 UTF-8;新增 ENT_HTML401、ENT_XHTML、ENT_XML1、ENT_HTML5
PHP 5.3.4 新增 encoding 参数

如果项目需要兼容较老 PHP 版本,应显式传入 encoding 参数,避免依赖默认值。

四、代码号学习编程示例

示例 1:默认翻译表

<?php
print_r(get_html_translation_table());
?>

默认等价于 HTML_SPECIALCHARS。输出中可以看到 &、"、<、> 等字符的实体映射。双引号对应 &quot;,单引号不在表中,因为默认 ENT_COMPAT 不处理单引号。

示例 2:HTML_ENTITIES 完整实体表

<?php
print_r(get_html_translation_table(HTML_ENTITIES));
?>

返回范围更大的实体表,包含更多命名实体。适合需要了解 HTML 实体映射的场景。

示例 3:ENT_QUOTES 同时处理单双引号

<?php
$table = get_html_translation_table(HTML_SPECIALCHARS, ENT_QUOTES);
print_r($table);
?>

此时单引号也会出现在翻译表中,对应 &#039;。在生成 HTML 属性时,如果属性值使用单引号包裹,这个标志就很有用。

示例 4:指定 UTF-8 与 HTML5

<?php
$table = get_html_translation_table(HTML_ENTITIES, ENT_QUOTES | ENT_HTML5, 'UTF-8');
print_r($table);
?>

显式声明编码和文档类型,避免因环境差异导致实体形式不一致。

五、项目反思与踩坑记录

踩坑一:忽略 flags 导致单引号未转义

早期项目中,输出到 value='...' 属性时只用了默认标志,单引号没有转义,用户输入包含单引号时直接截断属性。后来统一改为 ENT_QUOTES,问题消失。如果当时先查 get_html_translation_table() 的返回结果,就能很快定位到翻译表中缺少单引号映射。

踩坑二:编码不一致造成乱码实体

某次数据从 GB2312 数据库取出,未转换编码就直接调用 get_html_translation_table(),得到的实体表对中文标点处理异常。显式传入 UTF-8 并确保数据先转为 UTF-8 后,输出恢复正常。

经验建议

  • 不要依赖默认编码。始终显式传入 UTF-8。

  • 根据输出上下文选择 flags。HTML 属性中建议 ENT_QUOTES。

  • 使用 HTML_ENTITIES 前先确认目标文档类型,HTML5 与 HTML 4.01 的实体命名有差异。

  • 这个函数返回的是完整表,数据量较大。如果只需要转义,直接用 htmlspecialchars() 更高效。

六、本节课程知识要点

  • get_html_translation_table() 返回 htmlspecialchars() 和 htmlentities() 使用的翻译表。

  • table 参数控制表范围:HTML_SPECIALCHARS 或 HTML_ENTITIES。

  • flags 参数控制引号策略和文档类型,默认 ENT_COMPAT | ENT_HTML401。

  • encoding 参数在 PHP 5.4.0 后默认 UTF-8,建议显式指定。

  • 返回值是数组,键为原始字符,值为 HTML 实体。

  • 项目实践中应关注引号转义范围、编码一致性和文档类型匹配。

七、扩展对照:常用标志组合

场景 推荐 flags
普通 HTML 文本转义 ENT_COMPAT | ENT_HTML401
HTML 属性(单双引号都可能出现) ENT_QUOTES | ENT_HTML401
HTML5 文档 ENT_QUOTES | ENT_HTML5
XML 输出 ENT_QUOTES | ENT_XML1
不转义引号 ENT_NOQUOTES

掌握这张表,在自定义转义函数或审查转义结果时,可以直接对照翻译表定位问题,减少调试时间。

← PHP fprintf()函数:格式化字符串写入流指南 PHP hebrev()函数教程:希伯来文视觉文本转换、maxcharline参数与经验 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号