PHP 日本會議 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() 的轉換表。

注意:

特殊字元可以用多種方式編碼。例如," 可以編碼為 ""&#x22get_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 multibyte)、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 筆筆記

15
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);
?>
12
kevin at cwsmailbox dot xom
14 年前
請小心在迴圈中使用 get_html_translation_table(),因為它非常慢。
3
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));

你的伺服器需要給出一個 HTTP 標頭,使用 iso-8859-1 編碼,除非你使用 header() 或手動設定瀏覽器的編碼設定為 iso-8859-1。而且你需要檢視網頁原始碼才能看到對應。(除了英文版的 IE 7 無論如何都會將網頁原始碼輸出為 iso-8859-1)。
3
dirk at hartmann dot net
23 年前
get_html_translation_table
它只適用於前 256 個碼位。
對於更高的碼位,例如 ф
(一個西里爾字母),它會顯示相同的結果。
1
Jérôme Jaglale
17 年前
htmlentities 包含了 htmlspecialchars,所以這裡是如何轉換 UTF-8 字串的方法
htmlentities($string, ENT_QUOTES, 'UTF-8');
1
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)).';';
0
Maurizio Siliani at trident dot it
17 年前
如果你跟我一樣,從 ISO-8859-1 編碼的表單中取得資料時遇到問題,而且使用者是從 Word 複製貼上的,這個常式可能會很有用。
它將通常 M$ Word 會替換到輸入文字中的字元碼,加入到標準的 get_html_translation_table 中。
否則這些字元在 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;
}
0
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
-2
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);
}
?>
-3
Alex Minkoff
19 年前
如果你想在網頁瀏覽器中顯示特殊的 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>";
?>

如果你不這樣做,每個元素的鍵名看起來會跟元素內容相同,看起來會很蠢。;)
-4
kevin_bro at hostedstuff dot com
21 年前
Alans 的版本似乎無法正常運作。如果你遇到同樣的問題,請考慮改用這個稍微修改過的版本

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