在php中替换multibyte utf8字符

时间:2012-06-21 17:40:46

标签: php utf-8 replace multibyte

我试图将UTF中的欧元多字符(在我的html中显示为)转换为“$”而将*替换为“@”

$orig = "2 **** reviews  ⬠19,99 price";
$orig = mb_ereg_replace(mb_convert_encoding('€', 'UTF-8', 'HTML-ENTITIES'), "$", $orig);
$orig = preg_replace("/[\$\;\?\!\{\}\(\)\[\]\/\*\>\<]/", "@", $orig);
$a = htmlentities($orig);
$b = html_entity_decode($a);

“*”正在被替换,但不是“â”.......

还尝试用

替换它
$orig = preg_replace("/[\xe2\x82\xac]/", "$", $orig);

不转换....

另一项无效的计划:

$orig= mb_ereg_replace(mb_convert_encoding('&#x20ac;', 'UTF-8', 'HTML-ENTITIES'), "$", $orig);

Brrr有人知道如何摆脱这个utf8欧元字符:

echo html_entity_decode('&euro;');

(让我疯了)

3 个答案:

答案 0 :(得分:4)

这可能是由两个原因引起的:

  1. 实际源文本是UTF8编码的,但您的PHP代码不是。 您只需使用此行并将文件保存为UTF8编码即可解决此问题(尝试使用notepad ++)。

    str_replace('€','$',$ source);

  2. 源文本已损坏:多字节字符转换为latin1(错误的数据库字符集?)。您可以尝试将它们转换回latin1:

    str_replace('€','$',utf8_decode($ source))

答案 1 :(得分:0)

将我的评论贴在这里作为答案,以便你可以标记它!

不会

str_replace(html_entity_decode('&euro;'), '$', $source)

工作?

答案 2 :(得分:0)

$orig字符串中,您没有欧元符号。 当我运行这个php文件时:

<?php
$orig = "â¬";
for($i=0; $i<strlen($orig); $i++)
    echo '0x' . dechex(ord($orig{$i})) . ' ';
?>

如果保存为utf-8,我会收到:0xc3 0xa2 0xc2 0xac

如果保存为latin-1,我会收到:0xe2 0xac

在任何情况下,它都不是€符号:0xE2 0x82 0xAC或unicode \u20AChttp://www.fileformat.info/info/unicode/char/20ac/index.htm)。 0x82遗失了!!!!!

运行上面的程序,看看你得到了什么,并使用这个十六进制值来摆脱â¬

对于真正的符号,这有效:

<?php
    $orig = html_entity_decode('&euro;', ENT_COMPAT, 'UTF-8');
    $dest = preg_replace('~\x{20ac}~u', '$', $orig);

    echo "($orig) ($dest)";
?>

BTW如果包含€的UTF-8文件显示为latin-1,您应该得到: €而非â¬

事实上,编码和编码之间的转换存在问题。如果您尝试将€保存在latin1中,则中间字符将丢失(例如,我的Komodo会提醒我,然后将替换为?)。换句话说,你以某种方式损坏了你的€符号 - 然后你试图在它完成时替换它。 :d