Gia.. mi sai che il str_replace sia la tua risposta hai problemi.. io non saprei come fare diversamente
dai dai ti regalo una bella lista gia fatta :

Codice PHP:
function caratteri_speciali($stringa)
{
$stringa=str_replace("¡""¡"$stringa);
$stringa=str_replace("¢""¢"$stringa);
$stringa=str_replace("£""&puond;"$stringa);
$stringa=str_replace("¤""¤"$stringa);
$stringa=str_replace("¥""¥"$stringa);
$stringa=str_replace("¦""¦"$stringa);
$stringa=str_replace("§""§"$stringa);
$stringa=str_replace("¨""¨"$stringa);
$stringa=str_replace("©""©"$stringa);
$stringa=str_replace("ª""ª"$stringa);
$stringa=str_replace("«""«"$stringa);
$stringa=str_replace("¬""¬"$stringa);
$stringa=str_replace("_""­"$stringa);
$stringa=str_replace("®""®"$stringa);
$stringa=str_replace("¯""¯"$stringa);
$stringa=str_replace("°""°"$stringa);
$stringa=str_replace("±""±"$stringa);
$stringa=str_replace("²""²"$stringa);
$stringa=str_replace("³""³"$stringa);
$stringa=str_replace("´""´"$stringa);
$stringa=str_replace("µ""µ"$stringa);
$stringa=str_replace("¶""¶"$stringa);
$stringa=str_replace("·""·"$stringa);
$stringa=str_replace("¸""¸"$stringa);
$stringa=str_replace("¹""¹"$stringa);
$stringa=str_replace("º""º"$stringa);
$stringa=str_replace("»""»"$stringa);
$stringa=str_replace("¼""¼"$stringa);
$stringa=str_replace("½""½"$stringa);
$stringa=str_replace("¾""¾"$stringa);
$stringa=str_replace("¿""&iqurst;"$stringa);
$stringa=str_replace("À""À"$stringa);
$stringa=str_replace("Á""Á"$stringa);
$stringa=str_replace("Â""Â"$stringa);
$stringa=str_replace("Ã""Ã"$stringa);
$stringa=str_replace("Ä""Ä"$stringa);
$stringa=str_replace("Å""Å"$stringa);
$stringa=str_replace("Æ""Æ"$stringa);
$stringa=str_replace("Ç""Ç"$stringa);
$stringa=str_replace("È""È"$stringa);
$stringa=str_replace("É""É"$stringa);
$stringa=str_replace("Ê""Ê"$stringa);
$stringa=str_replace("Ë""Ë"$stringa);
$stringa=str_replace("Ì""Ì"$stringa);
$stringa=str_replace("Í""Í"$stringa);
$stringa=str_replace("Î""Î"$stringa);
$stringa=str_replace("Ï""Ï"$stringa);
$stringa=str_replace("Ð""Ð"$stringa);
$stringa=str_replace("Ñ""Ñ"$stringa);
$stringa=str_replace("Ò""Ò"$stringa);
$stringa=str_replace("Ó""Ó"$stringa);
$stringa=str_replace("Ô""Ô"$stringa);
$stringa=str_replace("Õ""Õ"$stringa);
$stringa=str_replace("Ö""Ö"$stringa);
$stringa=str_replace("×""×"$stringa);
$stringa=str_replace("Ø""Ø"$stringa);
$stringa=str_replace("Ù""Ù"$stringa);
$stringa=str_replace("Ú""Ú"$stringa);
$stringa=str_replace("Û""Û"$stringa);
$stringa=str_replace("Ü""Ü"$stringa);
$stringa=str_replace("Ý""Ý"$stringa);
$stringa=str_replace("Þ""Þ"$stringa);
$stringa=str_replace("ß""ß"$stringa);
$stringa=str_replace("à""à"$stringa);
$stringa=str_replace("á""á"$stringa);
$stringa=str_replace("â""â"$stringa);
$stringa=str_replace("ã""ã"$stringa);
$stringa=str_replace("ä""ä"$stringa);
$stringa=str_replace("å""å"$stringa);
$stringa=str_replace("æ""æ"$stringa);
$stringa=str_replace("ç""ç"$stringa);
$stringa=str_replace("è""è"$stringa);
$stringa=str_replace("é""é"$stringa);
$stringa=str_replace("ê""ê"$stringa);
$stringa=str_replace("ë""ë"$stringa);
$stringa=str_replace("ì""ì"$stringa);
$stringa=str_replace("í""í"$stringa);
$stringa=str_replace("î""î"$stringa);
$stringa=str_replace("ï""ï"$stringa);
$stringa=str_replace("ð""ð"$stringa);
$stringa=str_replace("ñ""ñ"$stringa);
$stringa=str_replace("ò""ò"$stringa);
$stringa=str_replace("ó""ó"$stringa);
$stringa=str_replace("ô""ô"$stringa);
$stringa=str_replace("õ""õ"$stringa);
$stringa=str_replace("ö""ö"$stringa);
$stringa=str_replace("÷""÷"$stringa);
$stringa=str_replace("ø""ø"$stringa);
$stringa=str_replace("ù""ù"$stringa);
$stringa=str_replace("ú""ú"$stringa);
$stringa=str_replace("û""û"$stringa);
$stringa=str_replace("ü""ü"$stringa);
$stringa=str_replace("ý""ý"$stringa);
$stringa=str_replace("þ""þ"$stringa);
$stringa=str_replace("ÿ""ÿ"$stringa);
return 
$stringa;

peró per quanto riguarda caratterei russi e ciniesi o altri idiogrammi, non saprei..
ma credo che sia questio di browser per la lettura .. per scrivere non so :O