PHP - 无法删除奇怪的字符

时间:2012-07-02 13:35:55

标签: php

我真的很感激这方面的一些帮助。我已经浪费了很多时间来解决这个问题,而且我在网上找到的任何建议都没有给我一个解决方法。

我有来自供应商的CSV文件。它似乎是从Microsoft系统导出的。

我正在使用PHP将数据导入MySQL(两个最新版本)。

我有一个特殊的记录,其中包含一个我无法摆脱的奇怪角色。可以手动编辑以删除角色,但我更喜欢自动解决方案,因为这将每天多次发生。

该角色似乎是对“智能引语”的解释。十六进制编辑器告诉我字符代码是C2和92.在十六进制编辑器中,它看起来像一个奇怪的A后跟一个智能引号。在其他编辑器和Calc,Writer等中它只是作为一个盒子出现。メ

我正在使用mb_detect_encoding来确定编码。 CSV文件中的所有记录都以ASCII格式返回,但具有奇怪字符的记录除外,该字符将返回为UTF-8。 我可以将违规记录插入到MySQL中,它只是在Workbench中显示为正方形。

MySQL表配置为utf-8 – utf8_unicode_ci,其他不寻常的UTF字符(例如分数)都可以。

我已经尝试了很多解决方案......

等等,但没有一个对我有用。

我真正想做的就是删除或替换有问题的字符,理想情况下是搜索和替换十六进制值,但我尝试过的例子都没有。

有人可以帮我推进这个吗?

修改
由于信誉不足,无法发布答案:
感谢您的输入。非常感谢。
我将使用十六进制搜索并替换:

$DodgyText = preg_replace("/\xEF\xBE\x92/", "" ,$DodgyText);

我知道这不是优雅的解决方案,但我需要快速修复,这对我有用。

3 个答案:

答案 0 :(得分:1)

快速浏览一下,这看起来像一个UTF-8文件。 (UTF-8与ASCII表中的前128个字符相同,因此除了特殊字符外,所有内容都被检测为ASCII。)

如果您的数据库连接也是UTF-8编码(默认情况下可能不是这样),它应该可以工作。

如何做到这一点取决于你的数据库库,如果你需要帮助设置连接编码,请告诉我们你正在使用哪一个。

答案 1 :(得分:1)

另一种解决方案是:

$contents = iconv('UTF-8', 'Windows-1251//IGNORE',$contents);
$contents = iconv('Windows-1251', 'UTF-8//IGNORE',$contents);

您可以将Windows-1251替换为本地编码。

答案 2 :(得分:0)

根据既定结果更新代码

你可以做搜索&使用十六进制表示法替换字符串:

str_replace("\xEF\xBE\x92", '', $value);

这将返回删除了特殊代码的值

也就是说,如果你的数据库表是UTF-8,你不应该需要那个转换;相反,您可以查看连接(或会话)字符集(即SET NAMES utf8;)。配置这取决于您用来连接数据库的库。

要调试您可以使用bin2hex()的值;这通常有助于在线搜索。