Для простых случаев, таких как слова или небольшие предложения, я всегда использую Sjoerd answer , и это работает.Для более сложных случаев, таких как длинные и сложные абзацы, возможно, включая некоторые HTML, я использую библиотеку HTMLPurifier с этим набором опций
require_once dirname(__FILE__) . '/htmlpurifier/HTMLPurifier.auto.php';
$config = HTMLPurifier_Config::createDefault();
$config->set('Core.Encoding', 'utf-8');
$config->set('Core.EscapeNonASCIICharacters', true);
$config->set('Cache.SerializerPath', sys_get_temp_dir());
$config->set('HTML.Allowed', 'a[href],strong,b,i,p');
$config->set('HTML.TidyLevel', 'heavy');
$purifier = new HTMLPurifier($config);
echo $purifier->purify('òàòààòòààè');
Он заменит любой не ASCII-символ на соответствующийHTML-сущность, таким образом вы избавляетесь от всех проблем с кодированием для таких строк.Например, òàòààòòààè
станет àòàòèàòèàòè
, что удобно для кодирования, поскольку не содержит символов, не относящихся к ASCII.
PS в любом случае не используйте preg_replace
для задач такого рода, этонебезопасно, потому что вы не можете перечислить все возможные не ASCII-символы в регулярном выражении (или, лучше, вы можете, но это довольно подверженная ошибкам задача).
PPS здесь хороший документ по кодировке utf-8 и конвертация в php взята с сайта HTMLPurifier.