1

我真的很感激这方面的一些帮助。我在这个问题上浪费了好几天,我在网上找到的任何建议似乎都没有给我一个解决办法。

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

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

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

该字符似乎是对“智能引用”的解释。十六进制编辑器告诉我字符代码是 C2 和 92。在十六进制编辑器中,它看起来像一个奇怪的 A,后跟一个智能引号。在其他编辑器和 Calc、Writer 等中,它只是显示为一个框。メ</p>

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

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

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

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

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

任何人都可以帮我推进这个吗?

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

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

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

4

3 回答 3

3

另一种解决方案是:

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

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

于 2013-03-14T10:33:33.013 回答
1

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

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

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

于 2012-07-02T13:39:09.890 回答
0

根据既定发现更新代码

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

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

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

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

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

于 2012-07-02T13:42:16.333 回答