PHP-Can';不要删除奇怪的字符

PHP-Can';不要删除奇怪的字符,php,Php,我真的很感激你能帮我。我已经在这个问题上浪费了好几天的时间,在网上找到的建议似乎都不能解决我的问题 我有一个来自供应商的CSV文件。它似乎是从Microsoft系统导出的 我正在使用PHP将数据导入MySQL(两个最新版本) 我有一张特别的唱片,里面有一个我无法摆脱的奇怪字符。手动编辑以删除角色是可能的,但我更喜欢一个自动化的解决方案,因为这将发生在一天多次 这个角色似乎是对“聪明引语”的诠释。十六进制编辑器告诉我字符代码是C2和92。在十六进制编辑器中,它看起来像一个奇怪的a,后面跟着一个聪明

我真的很感激你能帮我。我已经在这个问题上浪费了好几天的时间,在网上找到的建议似乎都不能解决我的问题

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

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

我有一张特别的唱片,里面有一个我无法摆脱的奇怪字符。手动编辑以删除角色是可能的,但我更喜欢一个自动化的解决方案,因为这将发生在一天多次

这个角色似乎是对“聪明引语”的诠释。十六进制编辑器告诉我字符代码是C2和92。在十六进制编辑器中,它看起来像一个奇怪的a,后面跟着一个聪明的引号。在其他编辑器和Calc、Writer等中,它只是显示为一个框。メ

我使用mb_detect_编码来确定编码。CSV文件中的所有记录都以ASCII格式返回,但带有奇怪字符的记录除外,该记录以UTF-8格式返回。 我可以将有问题的记录插入MySQL,它只是以正方形出现在Workbench中

MySQL表被配置为
utf-8–utf8\u unicode\u ci
,其他不寻常的utf字符(如分数)也可以

我已经尝试了很多解决方法

但是他们都没有为我工作过

我真正想做的就是删除或替换有问题的字符,理想情况下是搜索并替换十六进制值,但我尝试过的示例都不起作用

有人能帮我继续这一步吗

编辑
由于声誉不足,无法发布答案:
谢谢你的意见。非常感谢。
我将使用十六进制搜索并替换:

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

我知道这不是一个优雅的解决方案,但我需要一个快速修复,这对我来说很有效。

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

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


如何执行此操作取决于您的数据库库,如果您需要帮助设置连接编码,请告诉我们您使用的是哪一个数据库库。

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

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


如何执行此操作取决于您的数据库库,如果您需要帮助设置连接编码,请告诉我们您正在使用哪一个数据库库。

根据已确定的结果更新代码。

您可以使用十六进制表示法对字符串进行搜索和替换:

str_replace("\xEF\xBE\x92", '', $value);
这将返回删除了特殊代码的值

也就是说,如果您的数据库表是UTF-8,则不需要进行这种转换;相反,您可以查看连接(或会话)字符集(即
集名称utf8;
)。配置此选项取决于用于连接到数据库的库


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

根据已确定的搜索结果更新代码

您可以使用十六进制表示法对字符串进行搜索和替换:

str_replace("\xEF\xBE\x92", '', $value);
这将返回删除了特殊代码的值

也就是说,如果您的数据库表是UTF-8,则不需要进行这种转换;相反,您可以查看连接(或会话)字符集(即
集名称utf8;
)。配置此选项取决于用于连接到数据库的库

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

另一种解决方案是:

$contents = iconv('UTF-8', 'Windows-1251//IGNORE',$contents);
$contents = iconv('Windows-1251', 'UTF-8//IGNORE',$contents);
您可以将Windows-1251替换为本地编码。

另一种解决方案是:

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

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

C292
是否没有有效的UTF-8/Unicode代码点。。。WTF,Microsoft?您不需要preg_replace(),我已经根据您找到的实际十六进制值更新了我的答案。
C292
是否可能没有有效的UTF-8/Unicode码点。。。WTF,Microsoft?您不需要preg_replace(),我已经根据您找到的实际十六进制值更新了我的答案。我使用的是:mysql_select_db(db_DATABASE,$db);mysql_查询(“设置名称“utf8”对照“utf8\U unicode\U ci”)$结果=mysql\u查询($query,$db)@Simon您可以在不使用collate的情况下尝试
“设置名称'utf8'”
,并执行错误检查以查看查询是否成功吗?结果相同。这个メ 我使用的是:mysql\u select\u db(db\u DATABASE,$db);mysql_查询(“设置名称“utf8”对照“utf8\U unicode\U ci”)$结果=mysql\u查询($query,$db)@Simon您可以在不使用collate的情况下尝试
“设置名称'utf8'”
,并执行错误检查以查看查询是否成功吗?结果相同。这个メ 仍然存在。我尝试了,MySQL不喜欢它(查询失败:不正确的字符串值:'\XBCQQ(…'表示列)。那个“qqq”是我的。@SimonRoberts我添加了一个你可以改进你的问题的东西:十六进制表示法中的精确字符串内容。我想我可能把那些十六进制值弄错了。我只是再看一遍,文本字符串是(用点代替奇怪的字符)是“那……正是”。对应的十六进制字符串是“74 68 61 74 EF BE 92 73 20 65 78 61 63 74 6C 79”。@simonroberts好吧,你可以在上面做str_replace()或者使用utf8_encode()?我试过了,MySQL不喜欢它(查询失败:不正确的字符串值:'\XBCQQ(…)作为列).那个qqq是我的。@SimonRoberts我补充了一件事,你可以改进你的问题w