2012-06-28 20 views
5

Quiero escribir en un archivo de texto. Cuando uso substr_replace en php, la codificación cambia. No imprime caracteres griegos correctamente. Si no, todo está bien. ¿Alguna sugerencia?substr_replace codificación en 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"); 
} 
?> 

RESULTADO
εφδφ
δφδσφδσ
δφδφδ

RESULTADO SIN substr_replace
δφδφ
δφδσφδσ
δφδφδ

+1

Puede probar esta función de varios bytes http://lv.php.net/manual/en/function.substr-replace.php#59544 – arma

+0

Sí, el mismo codificación –

+1

Debe usar funciones multibyte para hacer lo que quiera en este caso. Un 'substr_replace' simple solo funciona en los datos como una cadena binaria, sin importar la codificación. – Christian

Respuesta

0

Usted podría tratar de usar la función de mb_convert_encoding() s et la codificación correcta.

3

Suponiendo que está codificando el griego en una codificación de varios bytes (como UTF-8), esto no funcionará porque las funciones de cadena PHP central, incluyendo substr_replace, no son conscientes de varios bytes. Tratan a un personaje como igual a un byte, lo que significa que terminará cortando caracteres de varios bytes a la mitad si solo reemplaza su primer byte. Es necesario utilizar un enfoque más manual que implica una función de cadena conscientes de varios bytes como mb_substr:

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

The comment @arma links to en los comentarios que envuelve la funcionalidad en una función.

3

Prueba esta versión:

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

esta función tiene errores – evilReiko

+0

¿Cuidar para explicar @evilReiko? –

+0

Lo probé, funcionó bien, pero luego me di cuenta de que a veces se elimina el primer carácter después del reemplazo – 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

Usted puede utilizar estas dos funciones:

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

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

He intentado tanto y ambos funcionan bien

Cuestiones relacionadas