PHP中的substr_replace编码
Posted
技术标签:
【中文标题】PHP中的substr_replace编码【英文标题】:substr_replace encoding in PHP 【发布时间】:2012-06-29 16:12:33 【问题描述】:我想写入一个文本文件。当我在 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()
δφδφ δφδσφδσ δφδφδ
【问题讨论】:
你可以试试这个多字节函数lv.php.net/manual/en/function.substr-replace.php#59544 在这种情况下,您必须使用多字节函数来执行您想要的操作。一个普通的substr_replace
仅适用于作为二进制字符串的数据 - 不关心编码。
【参考方案1】:
您可以尝试使用mb_convert_encoding()
函数来设置正确的编码。
【讨论】:
【参考方案2】:假设您以多字节编码(如 UTF-8)对希腊语进行编码,这将不起作用,因为核心 PHP 字符串函数(包括 substr_replace
)不支持多字节。他们将一个字符视为等于一个字节,这意味着如果您只替换它们的第一个字节,您最终会将多字节字符切成两半。您需要使用更手动的方法,涉及像 mb_substr
这样的多字节感知字符串函数:
mb_internal_encoding('UTF-8');
echo 'ε' . mb_substr('δφδφ', 1);
cmets 中的The comment @arma links to 将该功能包装在一个函数中。
【讨论】:
【参考方案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;
【讨论】:
这个功能有问题 想解释一下@evilReiko? 我试过了,效果很好,但后来我注意到有时它会在替换后删除第一个字符 @evilReiko $replacement的第一个字符? 我在 cmets 中读到这个函数有问题。这样对吗?你试过@EdsonMedina 吗?【参考方案4】: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;
【讨论】:
【参考方案5】:你可以使用这两个函数:
来自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]);
我都试过了,都很好用。
【讨论】:
以上是关于PHP中的substr_replace编码的主要内容,如果未能解决你的问题,请参考以下文章
php [php:mb_substr_replace()] PHP手册中substr_replace()的用户功能。 #PHP
PHP隐藏身份证号中间四位(适用老版15位与18位身份证号)
php RundownDryCoqui由JessieTabilisma创建 - https://repl.it/@JessieTabilisma/RundownDryCoqui