1<?php
2//============================================================+
3// File name   : html_entity_decode_php4.php
4// Begin       : 2006-06-22
5// Last Update : 2008-04-01
6// Author      : Nicola Asuni
7// Version     : 1.0.000
8// License     : GNU LGPL (http://www.gnu.org/copyleft/lesser.html)
9// 	----------------------------------------------------------------------------
10//  Copyright (C) 2002-2008  Nicola Asuni - Tecnick.com S.r.l.
11//
12// 	This program is free software: you can redistribute it and/or modify
13// 	it under the terms of the GNU Lesser General Public License as published by
14// 	the Free Software Foundation, either version 2.1 of the License, or
15// 	(at your option) any later version.
16//
17// 	This program is distributed in the hope that it will be useful,
18// 	but WITHOUT ANY WARRANTY; without even the implied warranty of
19// 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20// 	GNU Lesser General Public License for more details.
21//
22// 	You should have received a copy of the GNU Lesser General Public License
23// 	along with this program.  If not, see <http://www.gnu.org/licenses/>.
24//
25// 	See LICENSE.TXT file for more information.
26//  ----------------------------------------------------------------------------
27//
28//
29// Description : This is a PHP4 function that redefine the
30//               standard html_entity_decode function to support
31//               UTF-8 encoding.
32//
33//
34// Author: Nicola Asuni
35//
36// (c) Copyright:
37//               Nicola Asuni
38//               Tecnick.com S.r.l.
39//               Via della Pace, 11
40//               09044 Quartucciu (CA)
41//               ITALY
42//               www.tecnick.com
43//               info@tecnick.com
44//============================================================+
45
46/**
47 * This is a PHP4 function that redefine the standard
48 * html_entity_decode function to support UTF-8 encoding.
49 * @package com.tecnick.tcpdf
50 * @author Nicola Asuni
51 * @copyright 2004-2008 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com
52 * @link http://www.tcpdf.org
53 * @license http://www.gnu.org/copyleft/lesser.html LGPL
54 */
55
56/**
57 * Returns the UTF-8 string corresponding to unicode value.
58 * @param $num unicode value to convert.
59 * @return string converted
60 */
61function code_to_utf8($num) {
62	if ($num <= 0x7F) {
63		return chr($num);
64	} elseif ($num <= 0x7FF) {
65		return chr(($num >> 0x06) + 0xC0).chr(($num & 0x3F) + 128);
66	} elseif ($num <= 0xFFFF) {
67		return chr(($num >> 0x0C) + 0xE0).chr((($num >> 0x06) & 0x3F) + 0x80).chr(($num & 0x3F) + 0x80);
68	} elseif ($num <= 0x1FFFFF) {
69		return chr(($num >> 0x12) + 0xF0).chr((($num >> 0x0C) & 0x3F) + 0x80).chr((($num >> 0x06) & 0x3F) + 0x80).chr(($num & 0x3F) + 0x80);
70	}
71	return ' '; // default value
72}
73
74/**
75 * Reverse function for htmlentities.
76 * Convert entities in UTF-8.
77 * @param $text_to_convert Text to convert.
78 * @return string converted
79 */
80function html_entity_decode_php4($text_to_convert) {
81	$htmlentities_table = array (
82		"&Aacute;" => "".chr(195).chr(129)."",
83		"&aacute;" => "".chr(195).chr(161)."",
84		"&Acirc;" => "".chr(195).chr(130)."",
85		"&acirc;" => "".chr(195).chr(162)."",
86		"&acute;" => "".chr(194).chr(180)."",
87		"&AElig;" => "".chr(195).chr(134)."",
88		"&aelig;" => "".chr(195).chr(166)."",
89		"&Agrave;" => "".chr(195).chr(128)."",
90		"&agrave;" => "".chr(195).chr(160)."",
91		"&alefsym;" => "".chr(226).chr(132).chr(181)."",
92		"&Alpha;" => "".chr(206).chr(145)."",
93		"&alpha;" => "".chr(206).chr(177)."",
94		"&amp;" => "".chr(38)."",
95		"&and;" => "".chr(226).chr(136).chr(167)."",
96		"&ang;" => "".chr(226).chr(136).chr(160)."",
97		"&Aring;" => "".chr(195).chr(133)."",
98		"&aring;" => "".chr(195).chr(165)."",
99		"&asymp;" => "".chr(226).chr(137).chr(136)."",
100		"&Atilde;" => "".chr(195).chr(131)."",
101		"&atilde;" => "".chr(195).chr(163)."",
102		"&Auml;" => "".chr(195).chr(132)."",
103		"&auml;" => "".chr(195).chr(164)."",
104		"&bdquo;" => "".chr(226).chr(128).chr(158)."",
105		"&Beta;" => "".chr(206).chr(146)."",
106		"&beta;" => "".chr(206).chr(178)."",
107		"&brvbar;" => "".chr(194).chr(166)."",
108		"&bull;" => "".chr(226).chr(128).chr(162)."",
109		"&cap;" => "".chr(226).chr(136).chr(169)."",
110		"&Ccedil;" => "".chr(195).chr(135)."",
111		"&ccedil;" => "".chr(195).chr(167)."",
112		"&cedil;" => "".chr(194).chr(184)."",
113		"&cent;" => "".chr(194).chr(162)."",
114		"&Chi;" => "".chr(206).chr(167)."",
115		"&chi;" => "".chr(207).chr(135)."",
116		"&circ;" => "".chr(203).chr(134)."",
117		"&clubs;" => "".chr(226).chr(153).chr(163)."",
118		"&cong;" => "".chr(226).chr(137).chr(133)."",
119		"&copy;" => "".chr(194).chr(169)."",
120		"&crarr;" => "".chr(226).chr(134).chr(181)."",
121		"&cup;" => "".chr(226).chr(136).chr(170)."",
122		"&curren;" => "".chr(194).chr(164)."",
123		"&dagger;" => "".chr(226).chr(128).chr(160)."",
124		"&Dagger;" => "".chr(226).chr(128).chr(161)."",
125		"&darr;" => "".chr(226).chr(134).chr(147)."",
126		"&dArr;" => "".chr(226).chr(135).chr(147)."",
127		"&deg;" => "".chr(194).chr(176)."",
128		"&Delta;" => "".chr(206).chr(148)."",
129		"&delta;" => "".chr(206).chr(180)."",
130		"&diams;" => "".chr(226).chr(153).chr(166)."",
131		"&divide;" => "".chr(195).chr(183)."",
132		"&Eacute;" => "".chr(195).chr(137)."",
133		"&eacute;" => "".chr(195).chr(169)."",
134		"&Ecirc;" => "".chr(195).chr(138)."",
135		"&ecirc;" => "".chr(195).chr(170)."",
136		"&Egrave;" => "".chr(195).chr(136)."",
137		"&egrave;" => "".chr(195).chr(168)."",
138		"&empty;" => "".chr(226).chr(136).chr(133)."",
139		"&emsp;" => "".chr(226).chr(128).chr(131)."",
140		"&ensp;" => "".chr(226).chr(128).chr(130)."",
141		"&Epsilon;" => "".chr(206).chr(149)."",
142		"&epsilon;" => "".chr(206).chr(181)."",
143		"&equiv;" => "".chr(226).chr(137).chr(161)."",
144		"&Eta;" => "".chr(206).chr(151)."",
145		"&eta;" => "".chr(206).chr(183)."",
146		"&ETH;" => "".chr(195).chr(144)."",
147		"&eth;" => "".chr(195).chr(176)."",
148		"&Euml;" => "".chr(195).chr(139)."",
149		"&euml;" => "".chr(195).chr(171)."",
150		"&euro;" => "".chr(226).chr(130).chr(172)."",
151		"&exist;" => "".chr(226).chr(136).chr(131)."",
152		"&fnof;" => "".chr(198).chr(146)."",
153		"&forall;" => "".chr(226).chr(136).chr(128)."",
154		"&frac12;" => "".chr(194).chr(189)."",
155		"&frac14;" => "".chr(194).chr(188)."",
156		"&frac34;" => "".chr(194).chr(190)."",
157		"&frasl;" => "".chr(226).chr(129).chr(132)."",
158		"&Gamma;" => "".chr(206).chr(147)."",
159		"&gamma;" => "".chr(206).chr(179)."",
160		"&ge;" => "".chr(226).chr(137).chr(165)."",
161		"&harr;" => "".chr(226).chr(134).chr(148)."",
162		"&hArr;" => "".chr(226).chr(135).chr(148)."",
163		"&hearts;" => "".chr(226).chr(153).chr(165)."",
164		"&hellip;" => "".chr(226).chr(128).chr(166)."",
165		"&Iacute;" => "".chr(195).chr(141)."",
166		"&iacute;" => "".chr(195).chr(173)."",
167		"&Icirc;" => "".chr(195).chr(142)."",
168		"&icirc;" => "".chr(195).chr(174)."",
169		"&iexcl;" => "".chr(194).chr(161)."",
170		"&Igrave;" => "".chr(195).chr(140)."",
171		"&igrave;" => "".chr(195).chr(172)."",
172		"&image;" => "".chr(226).chr(132).chr(145)."",
173		"&infin;" => "".chr(226).chr(136).chr(158)."",
174		"&int;" => "".chr(226).chr(136).chr(171)."",
175		"&Iota;" => "".chr(206).chr(153)."",
176		"&iota;" => "".chr(206).chr(185)."",
177		"&iquest;" => "".chr(194).chr(191)."",
178		"&isin;" => "".chr(226).chr(136).chr(136)."",
179		"&Iuml;" => "".chr(195).chr(143)."",
180		"&iuml;" => "".chr(195).chr(175)."",
181		"&Kappa;" => "".chr(206).chr(154)."",
182		"&kappa;" => "".chr(206).chr(186)."",
183		"&Lambda;" => "".chr(206).chr(155)."",
184		"&lambda;" => "".chr(206).chr(187)."",
185		"&lang;" => "".chr(226).chr(140).chr(169)."",
186		"&laquo;" => "".chr(194).chr(171)."",
187		"&larr;" => "".chr(226).chr(134).chr(144)."",
188		"&lArr;" => "".chr(226).chr(135).chr(144)."",
189		"&lceil;" => "".chr(226).chr(140).chr(136)."",
190		"&ldquo;" => "".chr(226).chr(128).chr(156)."",
191		"&le;" => "".chr(226).chr(137).chr(164)."",
192		"&lfloor;" => "".chr(226).chr(140).chr(138)."",
193		"&lowast;" => "".chr(226).chr(136).chr(151)."",
194		"&loz;" => "".chr(226).chr(151).chr(138)."",
195		"&lrm;" => "".chr(226).chr(128).chr(142)."",
196		"&lsaquo;" => "".chr(226).chr(128).chr(185)."",
197		"&lsquo;" => "".chr(226).chr(128).chr(152)."",
198		"&macr;" => "".chr(194).chr(175)."",
199		"&mdash;" => "".chr(226).chr(128).chr(148)."",
200		"&micro;" => "".chr(194).chr(181)."",
201		"&middot;" => "".chr(194).chr(183)."",
202		"&minus;" => "".chr(226).chr(136).chr(146)."",
203		"&Mu;" => "".chr(206).chr(156)."",
204		"&mu;" => "".chr(206).chr(188)."",
205		"&nabla;" => "".chr(226).chr(136).chr(135)."",
206		"&nbsp;" => "".chr(194).chr(160)."",
207		"&ndash;" => "".chr(226).chr(128).chr(147)."",
208		"&ne;" => "".chr(226).chr(137).chr(160)."",
209		"&ni;" => "".chr(226).chr(136).chr(139)."",
210		"&not;" => "".chr(194).chr(172)."",
211		"&notin;" => "".chr(226).chr(136).chr(137)."",
212		"&nsub;" => "".chr(226).chr(138).chr(132)."",
213		"&Ntilde;" => "".chr(195).chr(145)."",
214		"&ntilde;" => "".chr(195).chr(177)."",
215		"&Nu;" => "".chr(206).chr(157)."",
216		"&nu;" => "".chr(206).chr(189)."",
217		"&Oacute;" => "".chr(195).chr(147)."",
218		"&oacute;" => "".chr(195).chr(179)."",
219		"&Ocirc;" => "".chr(195).chr(148)."",
220		"&ocirc;" => "".chr(195).chr(180)."",
221		"&OElig;" => "".chr(197).chr(146)."",
222		"&oelig;" => "".chr(197).chr(147)."",
223		"&Ograve;" => "".chr(195).chr(146)."",
224		"&ograve;" => "".chr(195).chr(178)."",
225		"&oline;" => "".chr(226).chr(128).chr(190)."",
226		"&Omega;" => "".chr(206).chr(169)."",
227		"&omega;" => "".chr(207).chr(137)."",
228		"&Omicron;" => "".chr(206).chr(159)."",
229		"&omicron;" => "".chr(206).chr(191)."",
230		"&oplus;" => "".chr(226).chr(138).chr(149)."",
231		"&or;" => "".chr(226).chr(136).chr(168)."",
232		"&ordf;" => "".chr(194).chr(170)."",
233		"&ordm;" => "".chr(194).chr(186)."",
234		"&Oslash;" => "".chr(195).chr(152)."",
235		"&oslash;" => "".chr(195).chr(184)."",
236		"&Otilde;" => "".chr(195).chr(149)."",
237		"&otilde;" => "".chr(195).chr(181)."",
238		"&otimes;" => "".chr(226).chr(138).chr(151)."",
239		"&Ouml;" => "".chr(195).chr(150)."",
240		"&ouml;" => "".chr(195).chr(182)."",
241		"&para;" => "".chr(194).chr(182)."",
242		"&part;" => "".chr(226).chr(136).chr(130)."",
243		"&permil;" => "".chr(226).chr(128).chr(176)."",
244		"&perp;" => "".chr(226).chr(138).chr(165)."",
245		"&Phi;" => "".chr(206).chr(166)."",
246		"&phi;" => "".chr(207).chr(134)."",
247		"&Pi;" => "".chr(206).chr(160)."",
248		"&pi;" => "".chr(207).chr(128)."",
249		"&piv;" => "".chr(207).chr(150)."",
250		"&plusmn;" => "".chr(194).chr(177)."",
251		"&pound;" => "".chr(194).chr(163)."",
252		"&prime;" => "".chr(226).chr(128).chr(178)."",
253		"&Prime;" => "".chr(226).chr(128).chr(179)."",
254		"&prod;" => "".chr(226).chr(136).chr(143)."",
255		"&prop;" => "".chr(226).chr(136).chr(157)."",
256		"&Psi;" => "".chr(206).chr(168)."",
257		"&psi;" => "".chr(207).chr(136)."",
258		"&radic;" => "".chr(226).chr(136).chr(154)."",
259		"&rang;" => "".chr(226).chr(140).chr(170)."",
260		"&raquo;" => "".chr(194).chr(187)."",
261		"&rarr;" => "".chr(226).chr(134).chr(146)."",
262		"&rArr;" => "".chr(226).chr(135).chr(146)."",
263		"&rceil;" => "".chr(226).chr(140).chr(137)."",
264		"&rdquo;" => "".chr(226).chr(128).chr(157)."",
265		"&real;" => "".chr(226).chr(132).chr(156)."",
266		"&reg;" => "".chr(194).chr(174)."",
267		"&rfloor;" => "".chr(226).chr(140).chr(139)."",
268		"&Rho;" => "".chr(206).chr(161)."",
269		"&rho;" => "".chr(207).chr(129)."",
270		"&rlm;" => "".chr(226).chr(128).chr(143)."",
271		"&rsaquo;" => "".chr(226).chr(128).chr(186)."",
272		"&rsquo;" => "".chr(226).chr(128).chr(153)."",
273		"&sbquo;" => "".chr(226).chr(128).chr(154)."",
274		"&Scaron;" => "".chr(197).chr(160)."",
275		"&scaron;" => "".chr(197).chr(161)."",
276		"&sdot;" => "".chr(226).chr(139).chr(133)."",
277		"&sect;" => "".chr(194).chr(167)."",
278		"&shy;" => "".chr(194).chr(173)."",
279		"&Sigma;" => "".chr(206).chr(163)."",
280		"&sigma;" => "".chr(207).chr(131)."",
281		"&sigmaf;" => "".chr(207).chr(130)."",
282		"&sim;" => "".chr(226).chr(136).chr(188)."",
283		"&spades;" => "".chr(226).chr(153).chr(160)."",
284		"&sub;" => "".chr(226).chr(138).chr(130)."",
285		"&sube;" => "".chr(226).chr(138).chr(134)."",
286		"&sum;" => "".chr(226).chr(136).chr(145)."",
287		"&sup1;" => "".chr(194).chr(185)."",
288		"&sup2;" => "".chr(194).chr(178)."",
289		"&sup3;" => "".chr(194).chr(179)."",
290		"&sup;" => "".chr(226).chr(138).chr(131)."",
291		"&supe;" => "".chr(226).chr(138).chr(135)."",
292		"&szlig;" => "".chr(195).chr(159)."",
293		"&Tau;" => "".chr(206).chr(164)."",
294		"&tau;" => "".chr(207).chr(132)."",
295		"&there4;" => "".chr(226).chr(136).chr(180)."",
296		"&Theta;" => "".chr(206).chr(152)."",
297		"&theta;" => "".chr(206).chr(184)."",
298		"&thetasym;" => "".chr(207).chr(145)."",
299		"&thinsp;" => "".chr(226).chr(128).chr(137)."",
300		"&THORN;" => "".chr(195).chr(158)."",
301		"&thorn;" => "".chr(195).chr(190)."",
302		"&tilde;" => "".chr(203).chr(156)."",
303		"&times;" => "".chr(195).chr(151)."",
304		"&trade;" => "".chr(226).chr(132).chr(162)."",
305		"&Uacute;" => "".chr(195).chr(154)."",
306		"&uacute;" => "".chr(195).chr(186)."",
307		"&uarr;" => "".chr(226).chr(134).chr(145)."",
308		"&uArr;" => "".chr(226).chr(135).chr(145)."",
309		"&Ucirc;" => "".chr(195).chr(155)."",
310		"&ucirc;" => "".chr(195).chr(187)."",
311		"&Ugrave;" => "".chr(195).chr(153)."",
312		"&ugrave;" => "".chr(195).chr(185)."",
313		"&uml;" => "".chr(194).chr(168)."",
314		"&upsih;" => "".chr(207).chr(146)."",
315		"&Upsilon;" => "".chr(206).chr(165)."",
316		"&upsilon;" => "".chr(207).chr(133)."",
317		"&Uuml;" => "".chr(195).chr(156)."",
318		"&uuml;" => "".chr(195).chr(188)."",
319		"&weierp;" => "".chr(226).chr(132).chr(152)."",
320		"&Xi;" => "".chr(206).chr(158)."",
321		"&xi;" => "".chr(206).chr(190)."",
322		"&Yacute;" => "".chr(195).chr(157)."",
323		"&yacute;" => "".chr(195).chr(189)."",
324		"&yen;" => "".chr(194).chr(165)."",
325		"&yuml;" => "".chr(195).chr(191)."",
326		"&Yuml;" => "".chr(197).chr(184)."",
327		"&Zeta;" => "".chr(206).chr(150)."",
328		"&zeta;" => "".chr(206).chr(182)."",
329		"&zwj;" => "".chr(226).chr(128).chr(141)."",
330		"&zwnj;" => "".chr(226).chr(128).chr(140)."",
331		"&gt;" => ">",
332		"&lt;" => "<"
333	);
334	$return_text = strtr($text_to_convert, $htmlentities_table);
335
336	// 07.11.2014, from php 5.3.0 fixed deprecated preg_replace with the /e flag. Joe
337	if (version_compare(PHP_VERSION, '5.3.0') >= 0 && function_exists("preg_replace_callback"))
338	{
339		$return_text = preg_replace_callback('~&#x([0-9a-f]+);~i', function ($m){ return chr(hexdec($m[1]));}, $return_text);
340		$return_text = preg_replace_callback('~&#([0-9]+);~', function ($m){ return chr($m[1]);}, $return_text);
341	}
342	else
343	{
344		$return_text = preg_replace('~&#x([0-9a-f]+);~ei', 'code_to_utf8(hexdec("\\1"))', $return_text);
345		$return_text = preg_replace('~&#([0-9]+);~e', 'code_to_utf8(\\1)', $return_text);
346	}
347	return $return_text;
348}
349
350//============================================================+
351// END OF FILE
352//============================================================+
353?>