Sys-Admin Forum

PHP - проблема с кодировкой, фильтрацией, ну убирается символ из строки

В базу заносится Text, принимает смайлики, но принимает их в виде Replacement character.
Принимаю с базы Text.
Вывожу на экран, с помощью echo

$commenttext = mb_convert_encoding($comment['text'], 'utf-8', mb_detect_encoding($comment['text']));
$commenttext = preg_replace('//', ' ', $commenttext);
if(!empty($commenttext))

Как убрать replacement character?

P.S. не могу убрать символ � из строки

Сам файл в котором содержится код в какой кодировке? Проверил наличие bom в данном файле?

Попробовал сохранить файл в кодировке с BOM, без BOM.
Без этой строчки в кодировке +BOM, вся кириллица выходила replacement’ами

$commenttext = preg_replace('/^[^0-9A-Za-zА-Яа-яЁё]+$/u', '', $commenttext);

В остальном без изменений.

А сами данные в каком формате передаются скрипту, может проблема с этой стороны? Я сам не php программист, но здесь явно похоже на проблему с кодировками…

Проблема решена добавлением двух функций, взятых с phpnet

function utf8_str_split($str) 
{ 
	$split=1; 
	$array = array(); 
	for ( $i=0; $i < strlen( $str ); )
	{ 
	$value = ord($str[$i]); 
	if($value > 127)
	{ 
	if($value >= 192 && $value <= 223) 
	$split=2; 
	elseif($value >= 224 && $value <= 239) 
	$split=3; 
	elseif($value >= 240 && $value <= 247) 
	$split=4; 
	}
	else
	{ 
	$split=1; 
	} 
	$key = NULL; 
	for ( $j = 0; $j < $split; $j++, $i++ ) 
	{ 
	$key .= $str[$i]; 
	} 
	array_push( $array, $key ); 
	} 
	return $array; 
	}

	function clearstr($str){ 
	$sru = 'ёйцукенгшщзхъфывапролджэячсмитьбю'; 
	$s1 = array_merge(utf8_str_split($sru), utf8_str_split(strtoupper($sru)), range('A', 'Z'), range('a','z'), range('0', '9'), 
	array('&',' ','#',';','%','?',':','(',')','|','-','_','=','+','[',']',',','.','/','\\')); 
	$codes = array(); 
	for ($i=0; $i<count($s1); $i++){ 
		$codes[] = ord($s1[$i]); 
        } 
        $str_s = utf8_str_split($str); 
	for ($i=0; $i<count($str_s); $i++){ 
	if (!in_array(ord($str_s[$i]), $codes)){ 
	$str = str_replace($str_s[$i], '', $str); 
	} 
        }  return $str; 
	} 

Использование:

echo clearstr('t♥e�s►t◄');

Полученный аргумент (строка) разбивается по символам в массив, затем символы переводятся в ASCII-код и сравниваются с заранее заготовленным массивом разрешенных символов. Если символ не прошел сравнение, вырезается, отформатированная строка возвращается. Таким образом мы вырезали все символы кроме: А-Я, A-Z, 0-9, &, пробел, #;%?:()- _=+[],./\

Отлично, держи +