htmlentities20.phpt 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. --TEST--
  2. htmlentities() / htmlspecialchars() ENT_DISALLOWED
  3. --FILE--
  4. <?php
  5. function codepoint_to_utf8($k) {
  6. if ($k < 0x80) {
  7. $retval = pack('C', $k);
  8. } else if ($k < 0x800) {
  9. $retval = pack('C2',
  10. 0xc0 | ($k >> 6),
  11. 0x80 | ($k & 0x3f));
  12. } else if ($k < 0x10000) {
  13. $retval = pack('C3',
  14. 0xe0 | ($k >> 12),
  15. 0x80 | (($k >> 6) & 0x3f),
  16. 0x80 | ($k & 0x3f));
  17. } else {
  18. $retval = pack('C4',
  19. 0xf0 | ($k >> 18),
  20. 0x80 | (($k >> 12) & 0x3f),
  21. 0x80 | (($k >> 6) & 0x3f),
  22. 0x80 | ($k & 0x3f));
  23. }
  24. return $retval;
  25. }
  26. $tests = array(
  27. 0x00, //C0
  28. 0x01,
  29. 0x09,
  30. 0x0A,
  31. 0x0B,
  32. 0x0C,
  33. 0x0D,
  34. 0x0E,
  35. 0x1F,
  36. 0x20, //allowed always
  37. 0x7F, //DEL
  38. 0x80, //C1
  39. 0x9F,
  40. 0xA0, //allowed always
  41. 0xD7FF, //surrogates
  42. 0xD800,
  43. 0xDFFF,
  44. 0xE000, //allowed always
  45. 0xFFFE, //nonchar
  46. 0xFFFF,
  47. 0xFDCF, //allowed always
  48. 0xFDD0, //nonchar
  49. 0xFDEF,
  50. 0xFDF0, //allowed always
  51. 0x2FFFE, //nonchar
  52. 0x2FFFF,
  53. );
  54. $tests2 = array_map('codepoint_to_utf8', $tests);
  55. $subchr = codepoint_to_utf8(0xFFFD);
  56. function test($flag) {
  57. global $tests, $tests2;
  58. $i = -1;
  59. foreach ($tests2 as $test) {
  60. $i++;
  61. $a = htmlentities($test, $flag | ENT_DISALLOWED, "UTF-8");
  62. $b = htmlspecialchars($test, $flag | ENT_DISALLOWED, "UTF-8");
  63. if ($a == "" && $b == "") { echo sprintf("%05X", $tests[$i]), ": INVALID SEQUENCE\n"; continue; }
  64. echo sprintf("%05X", $tests[$i]), ": ", bin2hex($a), " ", bin2hex($b), "\n";
  65. }
  66. }
  67. echo "*** Testing HTML 4.01 ***\n";
  68. test(ENT_HTML401);
  69. echo "\n*** Testing XHTML 1.0 ***\n";
  70. test(ENT_XHTML);
  71. echo "\n*** Testing HTML 5 ***\n";
  72. test(ENT_HTML5);
  73. echo "\n*** Testing XML 1.0 ***\n";
  74. test(ENT_XML1);
  75. ?>
  76. --EXPECT--
  77. *** Testing HTML 4.01 ***
  78. 00000: efbfbd efbfbd
  79. 00001: efbfbd efbfbd
  80. 00009: 09 09
  81. 0000A: 0a 0a
  82. 0000B: efbfbd efbfbd
  83. 0000C: efbfbd efbfbd
  84. 0000D: 0d 0d
  85. 0000E: efbfbd efbfbd
  86. 0001F: efbfbd efbfbd
  87. 00020: 20 20
  88. 0007F: efbfbd efbfbd
  89. 00080: efbfbd efbfbd
  90. 0009F: efbfbd efbfbd
  91. 000A0: 266e6273703b c2a0
  92. 0D7FF: ed9fbf ed9fbf
  93. 0D800: INVALID SEQUENCE
  94. 0DFFF: INVALID SEQUENCE
  95. 0E000: ee8080 ee8080
  96. 0FFFE: efbfbe efbfbe
  97. 0FFFF: efbfbf efbfbf
  98. 0FDCF: efb78f efb78f
  99. 0FDD0: efb790 efb790
  100. 0FDEF: efb7af efb7af
  101. 0FDF0: efb7b0 efb7b0
  102. 2FFFE: f0afbfbe f0afbfbe
  103. 2FFFF: f0afbfbf f0afbfbf
  104. *** Testing XHTML 1.0 ***
  105. 00000: efbfbd efbfbd
  106. 00001: efbfbd efbfbd
  107. 00009: 09 09
  108. 0000A: 0a 0a
  109. 0000B: efbfbd efbfbd
  110. 0000C: efbfbd efbfbd
  111. 0000D: 0d 0d
  112. 0000E: efbfbd efbfbd
  113. 0001F: efbfbd efbfbd
  114. 00020: 20 20
  115. 0007F: 7f 7f
  116. 00080: c280 c280
  117. 0009F: c29f c29f
  118. 000A0: 266e6273703b c2a0
  119. 0D7FF: ed9fbf ed9fbf
  120. 0D800: INVALID SEQUENCE
  121. 0DFFF: INVALID SEQUENCE
  122. 0E000: ee8080 ee8080
  123. 0FFFE: efbfbd efbfbd
  124. 0FFFF: efbfbd efbfbd
  125. 0FDCF: efb78f efb78f
  126. 0FDD0: efb790 efb790
  127. 0FDEF: efb7af efb7af
  128. 0FDF0: efb7b0 efb7b0
  129. 2FFFE: f0afbfbe f0afbfbe
  130. 2FFFF: f0afbfbf f0afbfbf
  131. *** Testing HTML 5 ***
  132. 00000: efbfbd efbfbd
  133. 00001: efbfbd efbfbd
  134. 00009: 265461623b 09
  135. 0000A: 264e65774c696e653b 0a
  136. 0000B: efbfbd efbfbd
  137. 0000C: 0c 0c
  138. 0000D: 0d 0d
  139. 0000E: efbfbd efbfbd
  140. 0001F: efbfbd efbfbd
  141. 00020: 20 20
  142. 0007F: efbfbd efbfbd
  143. 00080: efbfbd efbfbd
  144. 0009F: efbfbd efbfbd
  145. 000A0: 266e6273703b c2a0
  146. 0D7FF: ed9fbf ed9fbf
  147. 0D800: INVALID SEQUENCE
  148. 0DFFF: INVALID SEQUENCE
  149. 0E000: ee8080 ee8080
  150. 0FFFE: efbfbd efbfbd
  151. 0FFFF: efbfbd efbfbd
  152. 0FDCF: efb78f efb78f
  153. 0FDD0: efbfbd efbfbd
  154. 0FDEF: efbfbd efbfbd
  155. 0FDF0: efb7b0 efb7b0
  156. 2FFFE: efbfbd efbfbd
  157. 2FFFF: efbfbd efbfbd
  158. *** Testing XML 1.0 ***
  159. 00000: efbfbd efbfbd
  160. 00001: efbfbd efbfbd
  161. 00009: 09 09
  162. 0000A: 0a 0a
  163. 0000B: efbfbd efbfbd
  164. 0000C: efbfbd efbfbd
  165. 0000D: 0d 0d
  166. 0000E: efbfbd efbfbd
  167. 0001F: efbfbd efbfbd
  168. 00020: 20 20
  169. 0007F: 7f 7f
  170. 00080: c280 c280
  171. 0009F: c29f c29f
  172. 000A0: c2a0 c2a0
  173. 0D7FF: ed9fbf ed9fbf
  174. 0D800: INVALID SEQUENCE
  175. 0DFFF: INVALID SEQUENCE
  176. 0E000: ee8080 ee8080
  177. 0FFFE: efbfbd efbfbd
  178. 0FFFF: efbfbd efbfbd
  179. 0FDCF: efb78f efb78f
  180. 0FDD0: efb790 efb790
  181. 0FDEF: efb7af efb7af
  182. 0FDF0: efb7b0 efb7b0
  183. 2FFFE: f0afbfbe f0afbfbe
  184. 2FFFF: f0afbfbf f0afbfbf