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