2012-06-28 16 views
5

Voglio scrivere su un file di testo. Quando uso substr_replace in php cambia la codifica. Non stampa correttamente caratteri greci. Se non lo faccio tutto va bene. Eventuali suggerimenti?codifica substr_replace 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"); 
} 
?> 

ESITO
εφδφ
δφδσφδσ
δφδφδ

RISULTATO SENZA substr_replace
δφδφ
δφδσφδσ
δφδφδ

+1

Si può provare questa funzione multibyte http://lv.php.net/manual/en/function.substr-replace.php#59544 – arma

+0

Sì, lo stesso codifica –

+1

È necessario utilizzare le funzioni multibyte per eseguire ciò che si desidera in questo caso. Un semplice 'substr_replace' funziona solo sui dati come una stringa binaria, senza preoccuparsi della codifica. – Christian

risposta

0

Si potrebbe provare a utilizzare la funzione mb_convert_encoding() a s et la codifica corretta.

3

Supponendo che si codifichi il greco in una codifica multibyte (come UTF-8), questo non funzionerà perché le funzioni di base della stringa PHP, incluso substr_replace, non sono a conoscenza multi-byte. Trattano un carattere uguale a un byte, il che significa che alla fine si affideranno i caratteri multi-byte a metà se si sostituisce solo il loro primo byte. È necessario utilizzare un approccio più manuale che coinvolge una funzione di stringa a conoscenza multi-byte come mb_substr:

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

The comment @arma links to nei commenti avvolge tale funzionalità in una funzione.

3

Prova questa versione:

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

questa funzione è buggata – evilReiko

+0

Cura di spiegare @evilReiko? –

+0

L'ho provato, ha funzionato bene, ma poi ho notato che a volte rimuove il primo carattere dopo la sostituzione – 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

è possibile utilizzare queste due funzioni:

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

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

Ho provato entrambi ed entrambi funzionano bene