我想写一个文本文件。当我在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的结果
δφδφ
δφδσφδσ
δφδφδ
答案 0 :(得分:12)
您可以使用以下两个功能:
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]);
}
我试过了两个并且都很好用
答案 1 :(得分:3)
假设您使用多字节编码(如UTF-8)对希腊语进行编码,这将无效,因为核心PHP字符串函数(包括substr_replace
)不能识别多字节。它们将一个字符视为等于一个字节,这意味着如果只替换它们的第一个字节,您最终会将多字节字符切成两半。您需要使用更加手动的方法,包括多字节感知字符串函数,如mb_substr
:
mb_internal_encoding('UTF-8');
echo 'ε' . mb_substr('δφδφ', 1);
评论中的The comment @arma links to包含了函数中的功能。
答案 2 :(得分: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;
}
答案 3 :(得分:0)
您可以尝试使用mb_convert_encoding()
功能设置正确的编码。
答案 4 :(得分: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;
}