PHP Conference Japan 2024

get_html_translation_table

(PHP 4, PHP 5, PHP 7, PHP 8)

get_html_translation_table返回 htmlspecialchars()htmlentities() 使用的转换表

描述

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

get_html_translation_table() 将返回 htmlspecialchars()htmlentities() 内部使用的转换表。

注意:

特殊字符可以以多种方式编码。例如," 可以编码为 """get_html_translation_table() 只返回 htmlspecialchars()htmlentities() 使用的表单。

参数

table

要返回的表。HTML_ENTITIESHTML_SPECIALCHARS

flags

一个或多个以下标志的位掩码,它们指定表将包含哪些引号以及表适用于哪种文档类型。默认为 ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401

可用的 flags 常量
常量名 描述
ENT_COMPAT 表将包含双引号的实体,但不包含单引号的实体。
ENT_QUOTES 表将包含双引号和单引号的实体。
ENT_NOQUOTES 表既不包含单引号的实体,也不包含双引号的实体。
ENT_SUBSTITUTE 用 Unicode 替换字符 U+FFFD (UTF-8) 或 � (其他) 替换无效的代码单元序列,而不是返回空字符串。
ENT_HTML401 HTML 4.01 表。
ENT_XML1 XML 1 表。
ENT_XHTML XHTML 表。
ENT_HTML5 HTML 5 表。

encoding

要使用的编码。如果省略,则此参数的默认值为 UTF-8。

支持以下字符集

支持的字符集
字符集 别名 描述
ISO-8859-1 ISO8859-1 西欧,Latin-1。
ISO-8859-5 ISO8859-5 很少使用的西里尔字符集(Latin/Cyrillic)。
ISO-8859-15 ISO8859-15 西欧,Latin-9。添加了 Latin-1 (ISO-8859-1) 中缺少的欧元符号、法语和芬兰语字母。
UTF-8   ASCII 兼容多字节 8 位 Unicode。
cp866 ibm866, 866 DOS 专用西里尔字符集。
cp1251 Windows-1251, win-1251, 1251 Windows 专用西里尔字符集。
cp1252 Windows-1252, 1252 Windows 专用的西欧字符集。
KOI8-R koi8-ru, koi8r 俄语。
BIG5 950 繁体中文,主要用于台湾。
GB2312 936 简体中文,国家标准字符集。
BIG5-HKSCS   包含香港扩展的 Big5,繁体中文。
Shift_JIS SJIS, SJIS-win, cp932, 932 日语
EUC-JP EUCJP, eucJP-win 日语
MacRoman   Mac OS 使用的字符集。
''   空字符串将按顺序激活来自脚本编码 (Zend 多字节)、default_charset 和当前区域设置 (参见 nl_langinfo()setlocale()) 的检测。不推荐。

注意: 任何其他字符集都无法识别。将使用默认编码,并将发出警告。

返回值

返回转换表作为数组,原始字符作为键,实体作为值。

变更日志

版本 描述
8.1.0 flagsENT_COMPAT 更改为 ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401

示例

示例 #1 转换表示例

<?php
var_dump
(get_html_translation_table(HTML_ENTITIES, ENT_QUOTES | ENT_HTML5));
?>

上面的示例将输出类似于以下内容

array(1510) {
  ["
"]=>
  string(9) "&NewLine;"
  ["!"]=>
  string(6) "&excl;"
  ["""]=>
  string(6) "&quot;"
  ["#"]=>
  string(5) "&num;"
  ["$"]=>
  string(8) "&dollar;"
  ["%"]=>
  string(8) "&percnt;"
  ["&"]=>
  string(5) "&amp;"
  ["'"]=>
  string(6) "&apos;"
  // ...
}

参见

添加笔记

用户贡献笔记 11 个笔记

michael dot genesis at gmail dot com
12 年前
MS Word 和其他一些来源使用 CP-1252,并且它与 Latin1 ('ISO-8859-1') 非常接近,这导致了很多混淆。最让我困惑的是发现 MySQL 默认使用 CP-1252。

如果您想尝试这样做,可能会遇到麻烦
<?php
$trans
[chr(149)] = '&bull;'; // 实心圆点
$trans[chr(150)] = '&ndash;'; // 短破折号
$trans[chr(151)] = '&mdash;'; // 长破折号
$trans[chr(152)] = '&tilde;'; // 小波浪号
$trans[chr(153)] = '&trade;'; // 商标符号
?>

不要这样做。千万不要这样做!

您可以使用
<?php
$translationTable
= get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES, 'WINDOWS-1252');
?>

或者直接转换
<?php
$output
= htmlentities($input, ENT_NOQUOTES, 'WINDOWS-1252');
?>

但是您的网页可能使用 UTF-8 编码,您可能并不希望 CP-1252 文本到处乱飞,所以请先修正字符编码。
<?php
$output
= mb_convert_encoding($input, 'UTF-8', 'WINDOWS-1252');
$ouput = htmlentities($output);
?>
kevin at cwsmailbox dot xom
14年前
小心在循环中使用 `get_html_translation_table()`,因为它非常慢。
Kenneth Kin Lum
16年前
无论服务器编码是什么,都可以使用此方法在网页上显示映射

echo "<pre>\n";
echo htmlentities(print_r((get_html_translation_table(HTML_SPECIALCHARS)), true));
echo htmlentities(print_r((get_html_translation_table(HTML_ENTITIES)), true));

由于 `get_html_translation_table()` 实际上以 iso-8859-1 (Latin-1) 编码提供特殊字符,因此要正确查看表格,请使用

print_r(get_html_translation_table(HTML_ENTITIES));

您的服务器需要提供 iso-8859-1 的 HTTP 头,除非您使用 `header()` 或手动将浏览器的编码设置为 iso-8859-1。您需要查看页面的源代码才能看到映射。(除了 IE 7 的英文版本会将页面源代码输出为 iso-8859-1)。
dirk at hartmann dot net
23年前
get_html_translation_table
它只适用于前 256 个代码位置。
对于更高的位置,例如 &#1092;
(西里尔字母)它显示相同的内容。
Jérôme Jaglale
17年前
htmlentities 包含 htmlspecialchars,因此,以下是转换 UTF-8 字符串的方法
htmlentities($string, ENT_QUOTES, 'UTF-8');
iain (duh) workingsoftware.com.au
17年前
我写了一个快速的小函数,用于将类似 '&middot;' 的内容转换为 '&#183;'。

$to_convert = '&middot;';
$table = get_html_translation_table(HTML_ENTITIES);
$equiv = '&#'.ord(array_search($to_convert,$table)).';';
Maurizio Siliani at trident dot it
17年前
如果您(像我一样)在从 ISO-8859-1 编码的表单中获取数据时遇到问题(用户从 Word 中复制粘贴数据),则此例程可能很有用。
它为标准的 `get_html_translation_table` 添加了通常被 M$ Word 替换为键入文本的字符的代码。
否则,这些字符将永远无法在 html 输出中正确显示。

function get_html_translation_table_CP1252() {
$trans = get_html_translation_table(HTML_ENTITIES);
$trans[chr(130)] = '&sbquo;'; // 单低-9 引号
$trans[chr(131)] = '&fnof;'; // 带钩的拉丁小写字母 f
$trans[chr(132)] = '&bdquo;'; // 双低-9 引号
$trans[chr(133)] = '&hellip;'; // 水平省略号
$trans[chr(134)] = '&dagger;'; // 短剑
$trans[chr(135)] = '&Dagger;'; // 双短剑
$trans[chr(136)] = '&circ;'; // 修饰字母插入符重音
$trans[chr(137)] = '&permil;'; // 千分号
$trans[chr(138)] = '&Scaron;'; // 带有caron的拉丁大写字母S
$trans[chr(139)] = '&lsaquo;'; // 单左尖括号引号
$trans[chr(140)] = '&OElig; '; // 拉丁大写连字OE
$trans[chr(145)] = '&lsquo;'; // 左单引号
$trans[chr(146)] = '&rsquo;'; // 右单引号
$trans[chr(147)] = '&ldquo;'; // 左双引号
$trans[chr(148)] = '&rdquo;'; // 右双引号
$trans[chr(149)] = '&bull;'; // 实心圆点
$trans[chr(150)] = '&ndash;'; // 短破折号
$trans[chr(151)] = '&mdash;'; // 长破折号
$trans[chr(152)] = '&tilde;'; // 小波浪号
$trans[chr(153)] = '&trade;'; // 商标符号
$trans[chr(154)] = '&scaron;'; // 带有caron的拉丁小写字母s
$trans[chr(155)] = '&rsaquo;'; // 单右尖括号引号
$trans[chr(156)] = '&oelig;'; // 拉丁小写连字oe
$trans[chr(159)] = '&Yuml;'; // 带有分音符的拉丁大写字母Y
ksort($trans);
return $trans;
}
Patrick nospam at nospam mesopia dot com
19年前
不确定这里发生了什么,但我遇到一个其他人也可能面临的问题……

<?php

$translations
= array_flip(get_html_translation_table(HTML_ENTITIES,ENT_QUOTES));

?>

将单引号 ' 等同于 &#39;,而

<?php

$translatedString
= htmlentities($string,ENT_QUOTES);

?>
将其等同于 &#039;

目前我不得不进行特定的字符串替换……不确定是函数问题还是数组操作问题。

-Pat
kumar at chicagomodular.com
22年前
无需进行大量的科学分析,这似乎是一个快速修复方法,可以使源自 Microsoft Word 文档的文本显示为 HTML

<?php
function DoHTMLEntities ($string)
{
$trans_tbl = get_html_translation_table (HTML_ENTITIES);

// MS Word 的奇怪之处..
// 智能单/双引号:
$trans_tbl[chr(145)] = '\'';
$trans_tbl[chr(146)] = '\'';
$trans_tbl[chr(147)] = '&quot;';
$trans_tbl[chr(148)] = '&quot;';

// 锐音'e'
$trans_tbl[chr(142)] = '&eacute;';

return
strtr ($string, $trans_tbl);
}
?>
Alex Minkoff
19年前
如果您想在 Web 浏览器中显示特殊的 HTML 实体,可以使用以下代码

<?
$entities = get_html_translation_table(HTML_ENTITIES);
foreach ($entities as $entity) {
$new_entities[$entity] = htmlspecialchars($entity);
}
echo "<pre>";
print_r($new_entities);
echo "</pre>";
?>

如果您不这样做,每个元素的键名将看起来与元素内容本身相同,这会显得非常愚蠢。;)
kevin_bro at hostedstuff dot com
21年前
Alan 的版本似乎无法正常工作。如果您遇到同样的问题,请考虑使用此略微修改后的版本

function unhtmlentities ($string) {
$trans_tbl = get_html_translation_table (HTML_ENTITIES);
$trans_tbl = array_flip ($trans_tbl);
$ret = strtr ($string, $trans_tbl);
return preg_replace('/&#(\d+);/me',
"chr('\\1')",$ret);
}
To Top