【问题标题】:list of garbage characters like ’垃圾字符列表,如 ’
【发布时间】:2012-08-19 03:56:41
【问题描述】:

我正在使用 librets 从我的 RETS 服务器中检索数据。不知何故,librets 编码方法不起作用,我在输出中收到了一些奇怪的字符。我注意到像'''这样的字符被替换为€™。我无法找到 librets 的修复程序,所以我决定在下载数据后用实际值替换这些垃圾字符。我需要的是此类垃圾字符串及其等效字符的列表。我搜索了这个但没有找到任何资源。谁能指出这些垃圾字母的列表及其实际值或可以生成此类字母的一段代码。

感谢

【问题讨论】:

    标签: character-encoding rets


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • +1 同意并强调:很可能服务器正在做正确的事情,您需要调整您的代码或工具。在最简单的情况下,也许只需要配置您用来检查结果的查看工具,以显示 UTF-8 而不是 CP-1252 或 ISO-8859-1 或其他。
    • 同意。如果您使用 Internet Explorer 等 Web 浏览器查看输出,则可以使用简单的菜单选项更改字符集。 (转到“查看”并选择“编码”,然后从“西欧(Windows)”更改为“UTF-8”。您可能还想关闭“自动选择”选项。)设置编码时到 UTF-8,Internet Explorer 将获取 3 个“垃圾字符”,将它们解释为 UTF-8 字节,将它们转换回 Unicode 字符,并显示 Unicode 字符。在这种情况下,歌词不需要更改;您只需更改查看输出的方式。
    • 感谢澄清。 LIBRETS 提供了一种覆盖编码的方法,但它似乎不起作用。 Librets 论坛很可悲,他们不允许任何人发布问题,除非他们批准了注册用户,而且他们甚至在一个月后也没有批准我。
    【解决方案2】:

    问题提醒:

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

    严格处理这部分:

    "我需要的是这样的垃圾字符串列表和它们的等价物 字符。”

    使用 php,您可以生成这些字符及其等价物。使用所有 1,111,998 个 Unicode 点或 109,449 个 Utf8 符号是不切实际的。您可以在 € 和 Ă 之间的以下循环中使用 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 上下文中,大多数“垃圾”符号起源于 € 到 ā +(很少)῁ 到 ‶ 的范围内。

    为了显示“垃圾”符号,必须将 html 页面字符集设置为 iso-1 或首先导致问题的任何其他字符集。如果字符集设置为 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_ 函数可能很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2011-04-11
      • 2015-01-28
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      相关资源
      最近更新 更多