substr_replace encoding in PHP


substr_replace encoding in PHP

我想写入文本文件。当我在 PHP 中使用 substr_replace() 时,编码会发生变化。它无法正确打印希腊字符。如果我不这样做,一切都很好。我该如何解决这个问题?

<?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() 的结果

δφδφ
δφδσφδσ
δφδφδ

您可以使用这两个函数:

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

我尝试了两者,并且都工作得很好。

假设您以多字节编码(如 UTF-8)对希腊语进行编码,这将不起作用,因为核心 PHP 字符串函数(包括 substr_replace)不是多字节感知的。他们将一个字符视为等于一个字节,这意味着如果您只替换它们的第一个字节,您最终会将多字节字符切成两半。您需要使用涉及多字节感知字符串函数的更手动的方法,例如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;
}

您可以尝试使用 mb_convert_encoding() 函数来设置正确的编码。

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