いいえ、その通りです。マルチバイト文字列に対してシングルバイト文字列関数を使用すると、予期しない結果が生じる可能性があります。代わりにマルチバイト文字列関数を使用してください。たとえばmb_ereg_replace
、またはmb_split
:
$string = mb_ereg_replace('"', '\\"', $string);
$string = implode('\\"', mb_split('"', $string));
編集分割結合バリアントを使用し たmb_replace
実装は次のとおりです。
function mb_replace($search, $replace, $subject, &$count=0) {
if (!is_array($search) && is_array($replace)) {
return false;
}
if (is_array($subject)) {
// call mb_replace for each single string in $subject
foreach ($subject as &$string) {
$string = &mb_replace($search, $replace, $string, $c);
$count += $c;
}
} elseif (is_array($search)) {
if (!is_array($replace)) {
foreach ($search as &$string) {
$subject = mb_replace($string, $replace, $subject, $c);
$count += $c;
}
} else {
$n = max(count($search), count($replace));
while ($n--) {
$subject = mb_replace(current($search), current($replace), $subject, $c);
$count += $c;
next($search);
next($replace);
}
}
} else {
$parts = mb_split(preg_quote($search), $subject);
$count = count($parts)-1;
$subject = implode($replace, $parts);
}
return $subject;
}
パラメータの組み合わせに関しては、この関数は singlebyte のように動作する必要がありますstr_replace
。