7

テキストファイルに書き込みたい。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");
    }
?>

結果

ε�φδφ<br/> δφδσφδσ
δφδφδ

substr_replace()なしの結果

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

4

5 に答える 5

18

次の 2 つの関数を使用できます。

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

私は両方を試しましたが、どちらもうまくいきました。

于 2016-02-25T21:27:29.697 に答える
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;
}
于 2012-11-08T16:38:16.637 に答える
3

ギリシャ語をマルチバイト エンコーディング (UTF-8 など) でエンコードしていると仮定すると、 を含むコア PHP 文字列関数substr_replaceはマルチバイトを認識しないため、これは機能しません。1 文字を 1 バイトに等しいものとして扱います。つまり、最初のバイトだけを置き換えると、マルチバイト文字を半分にスライスすることになります。次のようなマルチバイト対応の文字列関数を含む、より手動のアプローチを使用する必要がありますmb_substr

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

コメント内の @arma リンク先のコメントは、その機能を関数にラップします。

于 2012-06-28T08:22:06.343 に答える
0

この関数を使用してmb_convert_encoding()、正しいエンコーディングを設定してみてください。

于 2012-06-28T08:07:43.587 に答える
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;
}
于 2014-03-26T20:27:44.873 に答える