Как поменять функцию, чтобы не было абракадабр?

function _replace(&$str, &$trans){
  for ($i = 0; $i < strlen($str); $i++)
	if (rand(0,1) and isset($trans[$str[$i]]))
		$str[$i] = $trans[$str[$i]];
}

Есть такая функция, смысл менять английские буквы на русские случайным образом (то есть не все совпадения подряд). Но после такой замены, получаются абракадабры. Видимо разное количество бит. Кодировка UTF-8. Что-то не соображу как это правильнее сделать.
  • Вопрос задан
  • 76 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега PHP
♬♬
Нечитаемые символы появляются из-за мультибайтовости кириллических символов. Обращение к строке по индексу возвращает значение 1 байта. Кириллические буквы занимают по 2 байта.

Можно разбивать строку в массив по символам, используя разделитель, понимающий Unicode:
function _replace(&$str, &$trans){
  $arr = preg_split('//u', $str, null, PREG_SPLIT_NO_EMPTY);
  for ($i = 0; $i < count($arr); $i++) {
	  if( isset($trans[$arr[$i]])  &&  rand(0,1)) {
	    $arr[$i] = $trans[$arr[$i]];
	  }
  }
  $str = implode('', $arr);
}


Как бить, с учётом Unicode, взял отсюда.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Используйте функции для работы с многобайтовыми строками
$str = mb_ereg_replace_callback(
  '[' . implode('', array_keys($trans)) . ']', 
  function($char) use ($trans) { 
    return (rand(0, 1) ? $trans[$char[0]] : $char[0]);
  }, 
  $str
);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы