<?php
function mb_fgets( &$file, $buf_size=1024 ){
$buf = fgets( $file, $buf_size );
//Прочитали до конца файла - обрабатывать нечего
if( fEoF($file) ) return $buf;
$byte = ord(substr( $buf, -1, 1 ));
//если меньше 0x7F - символ имеет однобайтовую кодировку,
//дочитывать ничего не нужно
if( $byte<=0x7F ) return $buf;
//чтение прервалось на многобайтовом символе.
//ищем стартовый байт, у него всегда включены 2 первых бита
$count=1;
while( $byte & 0xC0 != 0xC0 ){
$count++;
$byte = ord(substr( $buf, -$count, 1 ));
}
//считаем биты, до первого выключенного
//первые 2 можно не считать ;)
$mask = 0x40;
$bits_count = 2;
while( $byte & $mask ){
$mask = $mask >> 1;
$bits_count++;
}
//$count - сколько байт уже прочитано
//$bits_count - сколько нужно прочитать
return $buf . fgets( $file, $bits_count-$count );
}