【问题标题】:Remove Hidden Non-ASCII Characters [PHP or MySQL]删除隐藏的非 ASCII 字符 [PHP 或 MySQL]
【发布时间】:2011-10-28 15:08:44
【问题描述】:

我的数据库中存在隐藏的非 ASCII 字符(空格)问题。

如何将它们替换为普通空格并在插入之前对其进行转换以避免将来出现问题?

我仍然不能 100% 确定发生了什么,但我认为它与非 ASCII 空格有关。任何有助于追踪它的建议都会有所帮助。


这是发生了什么:

我有一个包含关键字的数据库,如果我搜索“测试关键字”,则没有任何显示。我知道“测试关键字”在数据库中。

如果我搜索“测试”或“关键字”,它就会显示出来。

如果我通过以下方式进行查询:

SELECT * FROM keywords WHERE keyword regexp '[^ -~]';(found here)

它将显示“测试关键字” - 让我得出结论,“测试关键字”中有一个带有空格的非 ASCII 字符。

【问题讨论】:

  • ASCII 指的是大多数字符集中的前 128 个字符,拉丁字母和数字等。我不认为这是你的意思。
  • ASCII 空格是普通空格。或许您可以举个例子说明您遇到的问题。
  • 除此之外,请描述您遇到的实际问题,而不是您认为应该解决的问题,即使您不确定发生了什么。不好的问题得到不好的答案。
  • 您是指控制还是不可打印字符?空间被认为是可见和可打印的,而不是隐藏的。
  • @Dan Grossman 实际上 ASCII 是前 128 个字符

标签: php mysql ascii


【解决方案1】:

This 适用于 PHP:

str_replace("\xA0", ' ', $keyword)

现在我正在尝试替换数据库中所有现有的。

我认为这应该可行,但不是:

update keywords set keyword = replace(keyword, char(160), " ") WHERE keyword regexp char(160);

有什么想法吗?

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,并且能够创建一个更新查询来替换(在我的情况下)非中断空格。

    首先,我分析了具有这些字符的字符串的二进制值(我使用 Mysql 工作台“在编辑器中打开值”来这样做)。我意识到在我的情况下,我想要替换的字符有'a0' 的十六进制值。

    接下来我去了http://www.fileformat.info/info/unicode/char/a0/charset_support.htm这个页面并检查了所有将a0解释为不间断空格的编码。

    接下来我构建了这个查询

    UPDATE keywords SET keyword = TRIM(REPLACE(keyword, CONVERT(char(160) USING hp8), ' '));
    

    ,我选择了 hp8,但 utf8 也可以。

    我花了一些时间才找到这个解决方案......所以我希望这可以帮助遇到同样问题的人,而不是为了寻找解决方案而失去理智。

    【讨论】:

    • utf8 对我不起作用,我不得不坚持使用 hp8 来获得 char(160)
    【解决方案3】:

    怎么样:

    update keywords
    set keyword = replace(keyword, char(160), ' ') 
    WHERE keyword LIKE concat('%',char(160),'%');
    

    【讨论】:

      【解决方案4】:

      要删除所有非字母数字字符吗?

      $string = “Here! is some text, and numbers 12345, and symbols !£$%^&”;
      
      $new_string = preg_replace(“/[^a-zA-Z0-9\s]/”, “”, $string);
      

      【讨论】:

      • 不,我希望能够保留所有标点符号。我的主要问题是使用了 ASCII 空格。它们在数据库中显示为常规空格,但行为不同(无法搜索或重复字符)。希望这是有道理的。
      猜你喜欢
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 2016-07-20
      相关资源
      最近更新 更多