Я хочу записать в текстовый файл. Когда я использую 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()
для установки правильной кодировки.