Prueba esto melado:
- Código: Seleccionar todo
<?php
$orig = "\x00\x02\x40\x00";
echo "Original en UTF-32: 0x" . bin2hex($orig) . " (el caracter que hace petar el foro)\n";
echo "Codificado a UTF-8: 0x" . bin2hex(mb_convert_encoding($orig, "UTF-8", "UTF-32BE")) . " (no peta, se codifica bien)\n";
$orig = "\x00\x10\xff\xff";
echo "Original en UTF-32: 0x" . bin2hex($orig) . " (limite de Unicode)\n";
echo "Codificado a UTF-8: 0x" . bin2hex(mb_convert_encoding($orig, "UTF-8", "UTF-32BE")) . " (es codificado correctamente)\n\n";
$orig = "\x00\x11\x00\x00";
echo "Original en UTF-32: 0x" . bin2hex($orig) . " (limite de Unicode + 1)\n";
echo "Codificado a UTF-8: 0x" . bin2hex(mb_convert_encoding($orig, "UTF-8", "UTF-32BE")) . " (es un caracter ilegal, asi que no se codifica)\n\n";
?>
Es una prueba que codifica en PHP el código que hace petar el foro. El límite de Unicode no es 0x10FFFF una vez ya codificado, sino antes de codificar (es decir, en UTF-32, su interpretación real).
El primero es el código que hace petar el foro (0x00024000), que es codificado correctamente. El segundo es el caracter límite de Unicode que si te fijas está por encima del 0x00024000 y también es codificado correctamente. El tercero es uno por encima del límite para demostrar que es 0x10FFFF antes de la codificación. Peta y devuelve una cadena vacía
EDIT: Y mira esto:
http://www.utf8-chartable.de/unicode-ut ... number=256 que pone U+24000 (en UTF-32) y al lado su representación
EDIT2: Es culpa de MySQL:
http://dev.mysql.com/doc/refman/5.1/en/ ... -utf8.html sí que es un UTF-8 válido, pero se ve que MySQL simplemente no lo soporta