我试图将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('€', 'UTF-8', 'HTML-ENTITIES'), "$", $orig);
Brrr有人知道如何摆脱这个utf8欧元字符:
echo html_entity_decode('€');
(让我疯了)
答案 0 :(得分:4)
这可能是由两个原因引起的:
实际源文本是UTF8编码的,但您的PHP代码不是。 您只需使用此行并将文件保存为UTF8编码即可解决此问题(尝试使用notepad ++)。
str_replace('€','$',$ source);
源文本已损坏:多字节字符转换为latin1(错误的数据库字符集?)。您可以尝试将它们转换回latin1:
str_replace('€','$',utf8_decode($ source))
答案 1 :(得分:0)
将我的评论贴在这里作为答案,以便你可以标记它!
不会
str_replace(html_entity_decode('€'), '$', $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 \u20AC
(http://www.fileformat.info/info/unicode/char/20ac/index.htm)。
0x82
遗失了!!!!!
运行上面的程序,看看你得到了什么,并使用这个十六进制值来摆脱â¬
。
对于真正的€
符号,这有效:
<?php
$orig = html_entity_decode('€', ENT_COMPAT, 'UTF-8');
$dest = preg_replace('~\x{20ac}~u', '$', $orig);
echo "($orig) ($dest)";
?>
BTW如果包含€的UTF-8文件显示为latin-1,您应该得到:
€而非â¬
。
事实上,编码和编码之间的转换存在问题。如果您尝试将€
保存在latin1中,则中间字符将丢失(例如,我的Komodo会提醒我,然后将‚
替换为?
)。换句话说,你以某种方式损坏了你的€符号 - 然后你试图在它完成时替换它。 :d