2012-06-28 2 views
5

Я хочу записать в текстовый файл. Когда я использую substr_replace в php, изменяется кодировка. Он не печатает греческие символы правильно. Если я не все хорошо. Какие-либо предложения?substr_replace encoding in 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
δφδφ
δφδσφδσ
δφδφδ

+1

Вы можете попробовать эту функцию многобайтовую http://lv.php.net/manual/en/function.substr-replace.php#59544 – arma

+0

Да, то же самое encoding –

+1

Вы должны использовать многобайтовые функции, чтобы делать то, что вы хотите в этом случае. Простой «substr_replace» работает только с данными как двоичная строка, не заботясь о кодировании. – Christian

ответ

0

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

3

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

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

The comment @arma links to в комментариях оборачивает эту функциональность в функции.

3

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

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; 
} 
+0

эта функция багги – evilReiko

+0

Ухаживать за @evilReiko? –

+0

Я пробовал, он работал нормально, но потом я заметил, что иногда он удаляет первый символ после замены – evilReiko

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; 
} 
4

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

из 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]); 
} 

Я пытался как и оба работают хорошо