【问题标题】:Replace one accentued characters in php替换php中的一个重音字符
【发布时间】:2026-01-29 03:15:02
【问题描述】:

我有一个带有一个法语重音字符的字符串(例如:lycée)。

我只想替换一个字符,但重音字符就像 2 个字符,结果永远不会好:

$str='lycée';
$str[3]='o';
echo $str;

结果是:

lycoe

但结果是

lyco�e

(所有设置都设置为 UTF8:php.ini、元字符集、mb_internal_encoding、notepad++ 文件编码...)

当我使用 substr_replace 函数时,我遇到了同样的问题。

如果我使用:

$str= iconv('UTF-8','ASCII//TRANSLIT',$str);

问题正在转移到其他角色:

$str='lycée';
$str= iconv('UTF-8','ASCII//TRANSLIT',$str);
$str[2]='o';

echo $str;

结果:

lyo?e

谁能帮帮我??

我只有角色的位置。

我想要:

$str[2]='o'  -> lyoée
$str[3]='o'  -> lycoe
$str[4]='o'  -> lycéo
...

【问题讨论】:

  • 如何使用str_replacemb_str_replace
  • 我不认识这个角色。我只是有位置
  • UTF-8 使用多个字节来编码非 ascii 字符,这解释了您的问题。您只需替换 é 字符的几个字节之一。
  • 我找到了解决办法!!!这是 mb_substr_replace 函数 (gist.github.com/stemar/8287074)
  • 啊好的,你有答案了,如果有帮助的话,我还有另一个答案

标签: php character non-ascii-characters


【解决方案1】:
<?php
$str='lycée';

//$str[3]='o';
//echo $str;


function mbStringToArray ($string) {
    $strlen = mb_strlen($string);
    while ($strlen) {
        $array[] = mb_substr($string,0,1,"UTF-8");
        $string = mb_substr($string,1,$strlen,"UTF-8");
        $strlen = mb_strlen($string);
    }
    return $array;
} 
$new_str=mbStringToArray($str);
$new_str[3]='o';
echo implode($new_str); //output: lycoe 

mb_split 手册页中的函数 mbStringToArray

【讨论】: