Используя стандарт "Для Каждого" цикла Вы не можете. Намерение "для Каждого" цикла состоит в том, чтобы позволить Вам концентрироваться на данных вместо базового набора.
Вы всегда можете использовать Многобайтовые строковые функции :
Если вы хотите использовать его часто и, возможно, когда-нибудь изменить:
1) Сначала установите кодировку, которую вы хотите использовать, в вашем файле конфигурации
/* Set internal character encoding to UTF-8 */
mb_internal_encoding("UTF-8");
2) Проверьте строку
if(mb_check_encoding($string))
{
// do something
}
Или, если вы не планируйте его менять, вы всегда можете просто поместить кодировку прямо в функцию:
if(mb_check_encoding($string, 'UTF-8'))
{
// do something
}
Вы пробовали ereg ()
вместо preg_match? Возможно, в этом нет этой ошибки, и вам не нужен потенциально ошибочный обходной путь.
У вас должна быть возможность использовать iconv для проверки действительности. Просто попробуйте преобразовать его в UTF-16 и посмотрите, не появится ли ошибка.
Вот решение на основе строковых функций:
http://www.php.net/manual/en/function.mb-detect-encoding.php#85294
<?php
function is_utf8($str) {
$c=0; $b=0;
$bits=0;
$len=strlen($str);
for($i=0; $i<$len; $i++){
$c=ord($str[$i]);
if($c > 128){
if(($c >= 254)) return false;
elseif($c >= 252) $bits=6;
elseif($c >= 248) $bits=5;
elseif($c >= 240) $bits=4;
elseif($c >= 224) $bits=3;
elseif($c >= 192) $bits=2;
else return false;
if(($i+$bits) > $len) return false;
while($bits > 1){
$i++;
$b=ord($str[$i]);
if($b < 128 || $b > 191) return false;
$bits--;
}
}
}
return true;
}
?>