垃圾字符列表,如“

时间:2012-08-19 03:56:41

标签: character-encoding rets

我正在使用librets从我的RETS服务器检索数据。以某种方式librets编码方法不起作用,我在输出中收到一些奇怪的字符。我注意到'''这样的字符被替换为''。我无法找到librets的修复,所以我决定在下载数据后用实际值替换这些垃圾追踪器。我需要的是这样的垃圾字符串及其等效字符的列表。我用谷歌搜索但没有找到任何资源。任何人都可以向我指出这些垃圾信件及其实际值的列表或可以生成此类信件的一段代码。

感谢名单

2 个答案:

答案 0 :(得分:10)

搜索术语"UTF-8",因为这就是您所看到的内容。

UTF-8是一种将Unicode字符表示为字节序列的方法。 (“Unicode字符”是人类语言中使用的全部字母和符号。)通常,一个Unicode字符在UTF-8中变为1,2或3个字节。当使用Windows通常使用的字符集显示这些字节(0到255之间的数字)时,它们显示为“垃圾” - 在这种情况下,3“垃圾字母”实际上是UTF-8编码的3个字节

在您的示例中,您开始使用智能引号字符。它在Unicode中的表示是数字 8217 ,或U + 2019(2019是8217的十六进制)。 (搜索"Unicode"以获取Unicode字符及其编号的完整列表。)数字8217的UTF-8表示是三字节序列 226 128 153 。当您将这三个字节显示为字符时,使用Windows“CP-1252”字符编码(在美国Windows上显示文本的普通方式),它们显示为’。 (搜索"CP-1252"以查看字节和字符表。)

我没有任何清单。但是,如果您使用内置支持Unicode和UTF-8的语言编写程序,则可以创建一个程序。我所能做的只是解释你所看到的。

如果有方法告诉librets在下载时使用UTF-8,那么这可能会自动解决您的问题。我对librets一无所知,但现在您知道“UTF-8”一词,您可能会取得进步。

答案 1 :(得分:0)

问题提醒:

  

“......我注意到'''这样的字符被替换为......我决定   下载后用实际值替换此类垃圾追踪器   数据。我需要的是这样的垃圾字符串及其列表   等效字符。“

严格处理这部分:

  

“我需要的是这样的垃圾字符串及其等价物的列表   字符“。

使用php,您可以生成这些字符及其等价物。使用所有1,111,998个Unicode点或109,449个Utf8符号是不切实际的。您可以在&#128和&#258之间的以下循环中使用ASCII范围,或者使用与您的上下文更相关的其他范围。

<?php
  for ($i=128; $i<258; $i++)
    $tmp1 .= "<tr><td>".htmlentities("&#$i;")."</td><td>".html_entity_decode("&#".$i.";",ENT_NOQUOTES,"utf-8")."</td><td>&#".$i.";</td></tr>";

  echo "<table border=1>
    <tr><td>&#</td><td>&quot;Garbage&quot;</td><td>symbol</td></tr>";
    echo $tmp1;
  echo "</table>";
?>

根据经验,在ASCII上下文中,大多数“垃圾”符号来自范围&amp;#128到&amp;#257 +(很少)&amp;#8129到&amp;#8246。

为了显示“垃圾”符号,必须将html页面字符集设置为iso-1或首先导致问题的其他字符集。如果charset设置为utf-8,它们将不会显示。

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

  

“我决定用实际值替换这些垃圾追踪者   下载数据后“

你不能用php utf8_decode()撤消“垃圾”,这实际上会在已经“垃圾”上创造更多“垃圾”。但是,您可以使用简单快速的搜索并替换php str_replace()函数。

首先,为要替换的每组“垃圾”符号生成2个数组。第一个数组是搜索词:

<?php
  //ISO 8859-1 (Latin-1) special chars are found in the range 128 to 257
  $tmp1 = "\$SearchArr = array(";
  for ($i=128; $i<258; $i++)
    $tmp1 .= "\"".html_entity_decode("&#".$i.";",ENT_NOQUOTES,"utf-8")."\", ";
  $tmp1 = substr($tmp1,0,strlen($tmp1)-2);//erases last comma
  $tmp1 .= ");";
  $tmp1 = htmlentities($tmp1,ENT_NOQUOTES,"utf-8");
?>

第二个数组是替换术语:

<?php
  //Adapt for your relevant range.
  $tmp2 = "\$ReplaceArr = array(\n";
  for ($i=128; $i<258; $i++)
    $tmp2 .= "\"&#".$i.";\", ";
  $tmp2 = substr($tmp2,0,strlen($tmp2)-2);//erases last comma
  $tmp2 .= ");";

  echo $tmp1."\n<br><br>\n";
  echo $tmp2."\n";
?>

现在,您已经有2个阵列可以复制和粘贴使用并重复使用,以清除任何受感染的字符串,如下所示:

$InfectedString = str_replace($SearchArr,$ReplaceArr,$InfectedString);

注意:utf8_decode()对清理“垃圾”符号毫无帮助。但是,它可以用来防止进一步的污染。或者,mb_函数可能很有用。