删除隐藏的非ASCII字符 [PHP或MySQL]

4

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

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

我仍然不确定发生了什么,但我认为是由于非ASCII空格引起的。任何帮助跟踪问题的建议都会有所帮助。


以下是具体情况:

我有一个关键字数据库,如果我搜索“test keyword”,则没有结果显示。我确信“test keyword”实际上存在于数据库中。

如果我搜索“test”或“keyword”,它将显示出来。

如果我使用以下查询:

SELECT * FROM keywords WHERE keyword regexp '[^ -~]';在此处找到

它将显示“test keyword” - 这让我得出结论,在“test keyword”中有一个带空格的非ASCII字符。


ASCII 指的是大多数字符集中的前 128 个字符,包括拉丁字母、数字等。我认为这不是你想要表达的意思。 - Dan Grossman
ASCII空格是普通的空格。也许你可以举个例子,说明你遇到了什么问题。 - thomasrutter
5
请描述您真正遇到的问题,而不是您认为应该修复的问题,即使您不确定发生了什么。糟糕的问题会得到糟糕的答案。 - Dan Grossman
你是指“控制字符”还是“不可打印字符”?空格被认为既可见又可打印,而不是隐藏的。 - Ray Toal
@Dan Grossman 实际上,ASCII 是前 128 个字符。 - thomasrutter
编辑 - 或许这样更能理解正在发生的事情。 - Ricky
4个回答

5
这段代码与PHP相关:

这里

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

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

我认为这应该可以工作,但实际上并没有:

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

有什么想法吗?

3

我曾遇到相同的问题,成功创建了一条更新查询语句,用以替换(在我的情况下)非换行空格。

首先,我分析了具有这些字符的字符串的二进制值(我使用MySQL Workbench中的“在编辑器中打开值”来完成此操作)。我意识到,在我的情况下,我想要替换的字符具有十六进制值'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)。 - xtian

1

这样怎么样:

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

0

您想删除所有非字母数字字符吗?

$string = “Here! is some text, and numbers 12345, and symbols !£$%^&”;

$new_string = preg_replace(“/[^a-zA-Z0-9\s]/”, “”, $string);

不,我希望能够保留所有标点符号。我的主要问题是使用ASCII空格。它们在数据库中显示为常规空格,但行为不同(无法搜索或复制字符)。希望这样说得清楚。 - Ricky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接