Кодировка substr_replace в PHP

Я хочу записать в текстовый файл. Когда я использую substr_replace в php, изменяется кодировка. Он не печатает греческие символы правильно. Если я не все хорошо. Какие-либо предложения?

<?php $file = "test.txt"; $writeFile = fopen($file, "w+");//read/write $myarray = array("δφδφ","δφδσφδσ","δφδφδ"); $myarray[0] = substr_replace($myarray[0],"ε", 0,1); foreach ($myarray as $data){ fwrite($writeFile, $data."\n"); } ?> 

РЕЗУЛЬТАТ
εφδφ
δφδσφδσ
δφδφδ

РЕЗУЛЬТАТЫ С НИКАКОЙ substr_replace
δφδφ
δφδσφδσ
δφδφδ

Предполагая, что вы кодируете греческий язык в многобайтовой кодировке (например, UTF-8), это не будет работать, потому что основные функции строки PHP, включая substr_replace , не являются многобайтовыми. Они обрабатывают один символ равным одному байту, а это означает, что вы закончите разбиение многобайтовых символов пополам, если вы замените только свой первый байт. Вы должны использовать более ручной подход, включающий многобайтную mb_substr функцию, такую ​​как mb_substr :

 mb_internal_encoding('UTF-8'); echo 'ε' . mb_substr('δφδφ', 1); 

Комментарий @arma ссылки в комментариях обертывают эту функциональность в функции.

Попробуйте эту версию:

 function mb_substr_replace ($string, $replacement, $start, $length = 0) { if (is_array($string)) { foreach ($string as $i => $val) { $repl = is_array ($replacement) ? $replacement[$i] : $replacement; $st = is_array ($start) ? $start[$i] : $start; $len = is_array ($length) ? $length[$i] : $length; $string[$i] = mb_substr_replace ($val, $repl, $st, $len); } return $string; } $result = mb_substr ($string, 0, $start, 'UTF-8'); $result .= $replacement; if ($length > 0) { $result .= mb_substr ($string, ($start+$length+1), mb_strlen($string, 'UTF-8'), 'UTF-8'); } return $result; } 

Вы можете использовать эти две функции:

от shkspr.mobi

 function mb_substr_replace($original, $replacement, $position, $length) { $startString = mb_substr($original, 0, $position, "UTF-8"); $endString = mb_substr($original, $position + $length, mb_strlen($original), "UTF-8"); $out = $startString . $replacement . $endString; return $out; } 

От GitHub

 function mb_substr_replace($str, $repl, $start, $length = null) { preg_match_all('/./us', $str, $ar); preg_match_all('/./us', $repl, $rar); $length = is_int($length) ? $length : utf8_strlen($str); array_splice($ar[0], $start, $length, $rar[0]); return implode($ar[0]); } 

Я пробовал оба, и оба работают хорошо

 function replace($string, $replacement, $start, $length = 0) { $result = mb_substr ($string, 0, $start, 'UTF-8'); $result .= $replacement; if ($length > 0) { $result .= mb_substr($string, ($start + $length), null, 'UTF-8'); } return $result; } 

Вы можете попробовать использовать mb_convert_encoding() для установки правильной кодировки.