Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP多字节str_替换?_Php_String_Replace_Multibyte Functions - Fatal编程技术网

PHP多字节str_替换?

PHP多字节str_替换?,php,string,replace,multibyte-functions,Php,String,Replace,Multibyte Functions,我试图在PHP中进行重音字符替换,但得到的结果很奇怪,我猜是因为我使用的是UTF-8字符串,str_replace无法正确处理多字节字符串 $accents_search = array('á','à','â','ã','ª','ä','å','Á','À','Â','Ã','Ä','é','è', 'ê','ë','É','È','Ê','Ë','í','ì','î','ï','Í','Ì','Î','Ï','œ','ò','ó','ô','õ','º','ø', 'Ø','Ó','Ò

我试图在PHP中进行重音字符替换,但得到的结果很奇怪,我猜是因为我使用的是UTF-8字符串,str_replace无法正确处理多字节字符串

$accents_search     = array('á','à','â','ã','ª','ä','å','Á','À','Â','Ã','Ä','é','è',
'ê','ë','É','È','Ê','Ë','í','ì','î','ï','Í','Ì','Î','Ï','œ','ò','ó','ô','õ','º','ø',
'Ø','Ó','Ò','Ô','Õ','ú','ù','û','Ú','Ù','Û','ç','Ç','Ñ','ñ'); 

$accents_replace    = array('a','a','a','a','a','a','a','A','A','A','A','A','e','e',
'e','e','E','E','E','E','i','i','i','i','I','I','I','I','oe','o','o','o','o','o','o',
'O','O','O','O','O','u','u','u','U','U','U','c','C','N','n'); 

$str = str_replace($accents_search, $accents_replace, $str);
我得到的结果是:

Ørjan Nilsen -> �orjan Nilsen
预期结果:

Ørjan Nilsen -> Orjan Nilsen

编辑:我已经将我的内部字符处理程序设置为UTF-8(根据mb_internal_encoding()),并且$str的值是UTF-8,所以从我所知道的,所有涉及的字符串都是UTF-8。str_replace()是否检测字符集并正确使用它们?

由于输入编码和文件编码不匹配,字符串似乎未被替换。

请尝试此函数定义:

if (!function_exists('mb_str_replace')) {
    function mb_str_replace($search, $replace, $subject) {
        if (is_array($subject)) {
            foreach ($subject as $key => $val) {
                $subject[$key] = mb_str_replace((string)$search, $replace, $subject[$key]);
            }
            return $subject;
        }
        $pattern = '/(?:'.implode('|', array_map(create_function('$match', 'return preg_quote($match[0], "/");'), (array)$search)).')/u';
        if (is_array($search)) {
            if (is_array($replace)) {
                $len = min(count($search), count($replace));
                $table = array_combine(array_slice($search, 0, $len), array_slice($replace, 0, $len));
                $f = create_function('$match', '$table = '.var_export($table, true).'; return array_key_exists($match[0], $table) ? $table[$match[0]] : $match[0];');
                $subject = preg_replace_callback($pattern, $f, $subject);
                return $subject;
            }
        }
        $subject = preg_replace($pattern, (string)$replace, $subject);
        return $subject;
    }
}

可以使用(NFD)和Unicode字符属性删除变音符号

NFD将类似“U”的umlaut从“带分音符的拉丁文小写字母U”(这是一个字母)转换为“拉丁文小写字母U”(字母)和“组合分音符”(不是字母)

输出:

aaaaªaaAAAAAeeeeEEEEiiiiIIIIœooooºøØOOOOuuuUUUcCNn
Normalizer类是的一部分。(算法本身并不复杂,但需要加载大量字符映射。我刚才写过。)


(我迟了两个月才加上它,因为我认为这是一种很好的技术,还不太广为人知。)

根据php文档,函数是二进制安全的,这意味着它可以处理
UTF-8
编码的文本,而不会丢失任何数据。

是的,UTF-8文件在cli上运行到文本文件(不要输出到iso终端)行得通。那么我该如何更改输入编码呢?如果您在开始时使用$str=“Ørjan Nilsen”,然后在结束时打印$str,它会给您正确的答案吗?如果您从cli读取以初始化$str,那么它可能没有使用正确的编码进行设置。谢谢,这实际上非常有用。虽然我真的不想在这个例子中使用它,因为它会导致口音的丢失。我认为消除口音是你想要做的事情?也许我错了,但正确的模式应该是:
”/('.preg_quote(introde('',('',(array)$search),'/')。)/u'
?在这里检查我的答案:。这对我帮助很大!!!谢谢你,戴维。这应该是正确的答案,因为它解释了为什么有mb_substr()和mb_strlen(),而没有mb_str_replace()。前两个函数使用(或返回)文本字符的偏移位置(取决于文本编码),而str_replace()不使用。这就是为什么str_replace()可以安全地处理UTF-8数据(或任何其他Unicode编码,或通常处理二进制数据)。为此,必须将带有
$accents_search
字符串的php文件保存为UTF-8。因此
str_replace()
的所有参数都是UTF-8。更多
aaaaªaaAAAAAeeeeEEEEiiiiIIIIœooooºøØOOOOuuuUUUcCNn