2012-06-28 42 views
5

Tôi muốn ghi vào một tệp văn bản. Khi tôi sử dụng substr_replace trong php các thay đổi mã hóa. Nó không in chính xác nhân vật Hy Lạp. Nếu tôi không làm mọi thứ đều ổn. Bất kỳ đề xuất?mã hóa substr_replace trong 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"); 
} 
?> 

KẾT QUẢ
εφδφ
δφδσφδσ
δφδφδ

KẾT QUẢ VỚI NO substr_replace
δφδφ
δφδσφδσ
δφδφδ

+1

Bạn có thể thử chức năng này multibyte http://lv.php.net/manual/en/function.substr-replace.php#59544 – arma

+0

Vâng, cùng mã hóa –

+1

Bạn phải sử dụng các chức năng nhiều byte để thực hiện những gì bạn muốn trong trường hợp này. Một 'substr_replace' đơn giản chỉ hoạt động trên dữ liệu dưới dạng chuỗi nhị phân - mà không cần phải mã hóa. – Christian

Trả lời

0

Bạn có thể thử bằng cách sử dụng chức năng để mb_convert_encoding() s et mã hóa chính xác.

3

Giả sử bạn đang mã hóa Hy Lạp trong một mã hóa đa byte (như UTF-8), điều này sẽ không làm việc vì các chức năng chuỗi PHP lõi, bao gồm substr_replace, không phải là đa byte biết. Chúng xử lý một ký tự bằng một byte, có nghĩa là bạn sẽ kết thúc việc cắt các ký tự nhiều byte thành một nửa nếu bạn chỉ thay thế byte đầu tiên của chúng. Bạn cần phải sử dụng một phương pháp thủ công nhiều hơn liên quan đến một đa-byte chuỗi chức năng nhận thức được như mb_substr:

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

The comment @arma links to trong các ý kiến ​​kết thúc tốt đẹp chức năng mà trong một hàm.

3

Hãy thử phiên bản này:

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

chức năng này là lỗi – evilReiko

+0

Chăm sóc để giải thích @evilReiko? –

+0

Tôi đã thử nó, nó làm việc tốt, nhưng sau đó tôi nhận thấy rằng đôi khi nó loại bỏ các ký tự đầu tiên sau khi thay thế – 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

Bạn có thể sử dụng hai chức năng:

từ 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; 
} 

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

tôi đã cố gắng cả hai và cả hai cũng làm việc