--- /dev/null
+--TEST--\r
+Test get_next_char(), used by htmlentities()/htmlspecialchars(): validity of UTF-8 sequences\r
+--FILE--\r
+<?php\r
+\r
+/* conformance to Unicode 5.2, section 3.9, D92 */\r
+\r
+$val_ranges = array(\r
+ array(array(0x00, 0x7F)),\r
+ array(array(0xC2, 0xDF), array(0x80, 0xBF)),\r
+ array(array(0xE0, 0xE0), array(0xA0, 0xBF), array(0x80, 0xBF)),\r
+ array(array(0xE1, 0xEC), array(0x80, 0xBF), array(0x80, 0xBF)),\r
+ array(array(0xED, 0xED), array(0x80, 0x9F), array(0x80, 0xBF)),\r
+ array(array(0xEE, 0xEF), array(0x80, 0xBF), array(0x80, 0xBF)),\r
+ array(array(0xF0, 0xF0), array(0x90, 0xBF), array(0x80, 0xBF), array(0x80, 0xBF)),\r
+ array(array(0xF1, 0xF3), array(0x80, 0xBF), array(0x80, 0xBF), array(0x80, 0xBF)),\r
+ array(array(0xF4, 0xF4), array(0x80, 0x8F), array(0x80, 0xBF), array(0x80, 0xBF)),\r
+);\r
+\r
+function is_valid($seq) {\r
+ global $val_ranges;\r
+ $b = ord($seq[0]);\r
+ foreach ($val_ranges as $l) {\r
+ if ($b >= $l[0][0] && $b <= $l[0][1]) {\r
+ if (count($l) != strlen($seq)) {\r
+ return false;\r
+ }\r
+ for ($n = 1; $n < strlen($seq); $n++) {\r
+ if (ord($seq[$n]) < $l[$n][0] || ord($seq[$n]) > $l[$n][1]) {\r
+ return false;\r
+ }\r
+ }\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+}\r
+\r
+function concordance($s) {\r
+ $vhe = strlen(htmlspecialchars($s, ENT_QUOTES, "UTF-8")) > 0;\r
+ $v = is_valid($s);\r
+ return ($vhe === $v);\r
+}\r
+\r
+for ($b1 = 0xC0; $b1 < 0xE0; $b1++) {\r
+ for ($b2 = 0x80; $b2 < 0xBF; $b2++) {\r
+ $s = chr($b1).chr($b2);\r
+ if (!concordance($s))\r
+ echo "Discordance for ".bin2hex($s),"\n";\r
+ }\r
+}\r
+\r
+\r
+for ($b1 = 0xE0; $b1 < 0xEF; $b1++) {\r
+ for ($b2 = 0x80; $b2 < 0xBF; $b2++) {\r
+ $s = chr($b1).chr($b2)."\x80";\r
+ if (!concordance($s))\r
+ echo "Discordance for ".bin2hex($s),"\n";\r
+ $s = chr($b1).chr($b2)."\xBF";\r
+ if (!concordance($s))\r
+ echo "Discordance for ".bin2hex($s),"\n";\r
+ }\r
+}\r
+\r
+for ($b1 = 0xF0; $b1 < 0xFF; $b1++) {\r
+ for ($b2 = 0x80; $b2 < 0xBF; $b2++) {\r
+ $s = chr($b1).chr($b2)."\x80\x80";\r
+ if (!concordance($s))\r
+ echo "Discordance for ".bin2hex($s),"\n";\r
+ $s = chr($b1).chr($b2)."\xBF\x80";\r
+ if (!concordance($s))\r
+ echo "Discordance for ".bin2hex($s),"\n";\r
+ $s = chr($b1).chr($b2)."\x80\xBF";\r
+ if (!concordance($s))\r
+ echo "Discordance for ".bin2hex($s),"\n";\r
+ $s = chr($b1).chr($b2)."\xBF\xBF";\r
+ if (!concordance($s))\r
+ echo "Discordance for ".bin2hex($s),"\n";\r
+ }\r
+}\r
+echo "Done.\n";\r
+--EXPECT--\r
+Done.\r