2011-03-10 67 views
2

我有一个PHP的Web应用程序/工具,人们最终的复制粘贴数据到。数据最终变成XML,一旦保存,某些字符会产生非常奇怪的字符。我不确定在复制粘贴之前,“”是否看起来像这样。它可能刚刚被这样解释。它可能只是一个漫长的“ - ”。无论如何,所有这些角色都很奇怪。有没有一种方法可以轻松地将它们去除?我怎样才能去掉奇复制粘贴的字符,如:①™€

回答

1

这是因为PHP采用8位编码,但你的数据是最有可能使用UTF-8。你会发现Joel's article on Encoding非常有启发性。

而对于简短的回答尽量只编码它在UTF-8

<?php 

    $text = $entity['Entity']['title']; 
    echo 'Original : ', $text."<br />"; 

    $enc = mb_detect_encoding($text, "UTF-8,ISO-8859-1"); 
    echo 'Detected Encoding '.$enc."<br />"; 

    echo 'Fixed Result: '.iconv($enc, "UTF-8", $text)."<br />"; 

?> 
+0

我希望我能接受多个答案......刚一说明,我使用CakePHP所以我用了上面的回答,用消毒库混合,基本上消毒的所有数据beforeSave,然后创建了一个名为unsanitize这样当功能人们编辑他们没有看到所有这些奇怪的html实体... – Parris 2011-03-16 23:36:33

1

它很可能是你的情况加入白名单,而不是黑名单更容易;即列出可接受的字符并剥去其余字符。为此,您可以轻松地使用preg_replace

$str = preg_replace($str, "/[A-Za-z0-9'-._\(\)/"); 
               | 
               V 
               add more chars here 
1

当你看到一个字符对开头的重音“A”或“a”,它通常意味着你看到一个字符,其实际编码为iso-8859-1,由认为其显示utf-8的软件显示。

如果你打算让人们使用不支持XML的工具在XML文档中修改文字,可能是你最终会与ISO-8859-1编码的字符。如果文件开头的XML声明存在,并且说编码是iso-8859-1,那应该没问题。但是,如果没有XML声明,或者声明中的编码是utf-8,那么最终会得到损坏的数据。

你询问有关如何修复数据,但是当您遇到数据损坏重点应该永远是预防,而不是修复。

+0

“当你遇到数据损坏时,应该始终关注预防而不是修复”同意。不幸的是,我认为解决方案将禁止从Word复制粘贴到其他任何内容。不是一个坏主意,但我认为它不会好转。 – Charles 2011-03-11 00:18:37

+0

我想这是问题...我试图使用的iconv,但如果情况存在,用户可以在不同的编码复制粘贴,然后数据标准化为UTF-8是困难的。 – Parris 2011-03-11 00:56:45