PHP多字节str_replace函数?
-
12-09-2019 - |
题
我试图做的重音字符替换在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()函数检测炭集和正确地使用它们?
解决方案
看起来未替换的字符串,因为你的输入编码和文件编码不匹配。
其他提示
根据PHP文档 str_replace函数函数是二进制安全的,这意味着它可以处理UTF-8
编码的文本没有任何数据丢失。
这是可能的,以除去使用 Unicode范式d (NFD)和Unicode字符附加符号属性。
NFD转换类似来自“拉丁小写字母U带分音符”(这是一个字母)来“拉丁小写字母U”(字母)和“合并分音符”(不是字母)。“U”形变音p>
header('Content-Type: text/plain; charset=utf-8');
$test = implode('', array('á','à','â','ã','ª','ä','å','Á','À','Â','Ã','Ä','é','è',
'ê','ë','É','È','Ê','Ë','í','ì','î','ï','Í','Ì','Î','Ï','œ','ò','ó','ô','õ','º','ø',
'Ø','Ó','Ò','Ô','Õ','ú','ù','û','Ú','Ù','Û','ç','Ç','Ñ','ñ'));
$test = Normalizer::normalize($test, Normalizer::FORM_D);
// Remove everything that's not a "letter" or a space (e.g. diacritics)
// (see http://de2.php.net/manual/en/regexp.reference.unicode.php)
$pattern = '/[^\pL ]/u';
echo preg_replace($pattern, '', $test);
输出:
aaaaªaaAAAAAeeeeEEEEiiiiIIIIœooooºøØOOOOuuuUUUcCNn
归一化的类是 PECL国际包的一部分。 (算法本身也不是很复杂,但需要AFAIK加载了很多字符映射。我写了一个的 PHP实施前一段时间。)
(我迟到添加此2个月因为我觉得这是一个很好的技术,现在还不知道不够广泛。)
尝试该功能定义:
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;
}
}
不隶属于 StackOverflow