转换在PHP和MySQL中从Word粘贴的字符

时间:2012-08-30 04:36:30

标签: php mysql

我有一个真正的噩梦从一个数据库解析数据,其中大部分文本已从Word粘贴到另一个数据库。数据需要每天通过解析器清洗,因此不仅仅是清理源数据一次。

问题在于目标在处理过程中不断移动,我的结果非常复杂。

该过程主要是复制从PHPMyAdmin生成的导出SQL;将其粘贴到表单中,然后运行解析脚本;然后,该脚本将“已清理”的数据保存到不同的数据库中。

数据中包含的内容包括......

等内容
Comply with “Regulations�

理想情况下,这将是......

Comply with "Regulations"

当所有解析完成并存储在新数据库中时,我留下......

Comply with AS3868 â€Å"Regulationsâ€Â

还有其他单词字符,如elipsis等,但这个例子只显示了智能引号。

通过表单发布数据后,我清理数据的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

这个问题最终要解决的问题远远超过听起来应该如此。基本上,数据在没有明确定义的编码环境的各种过程中破坏。基本上,数据是双重编码,因为它被解析,以便成为,然后变成•, < / p>

This thread极大地帮助了解环境问题以及如何确保PHP,MySQL和我的编码环境都使用UTF-8作为其默认值。

This site非常适合测试和修复mysql环境。该页面的代码在服务器上运行良好(使用SSL访问和更改)。我在本地使用WAMP服务器,但代码在那里运行不正常。我最终对my.ini文件进行了以下更改

[client]
...
default-character-set=utf8

[wampmysqld]
...
character-set-server=utf8
collation-server=utf8_general_ci
init-connect='SET NAMES utf8'

然后我需要修复那里的数据。

我只是用安全的单字节字符替换有问题的代码()但最后我决定确保多个字节字符已更正,以便在被视为UTF-8时显示。

我不想信任脚本来编码搜索和替换字符串,我发现了一个很好的起点here。我使用MySQL的UNHEX函数来控制这个方面:

-- Single quotes
UPDATE table SET column = REPLACE(column, UNHEX('C3A2E282ACCB9C'), UNHEX('E28098'));
UPDATE table SET column = REPLACE(column, UNHEX('C3A2E282ACE284A2'), UNHEX('E28099'));
-- Double quotes
UPDATE table SET column = REPLACE(column, UNHEX('C3A2E282ACC593'), UNHEX('E2809C'));
UPDATE table SET column = REPLACE(column, UNHEX('C3A2E282ACC29D'), UNHEX('E2809D'));
-- Em and En dashes
UPDATE table SET column = REPLACE(column, UNHEX('C3A2E282ACE2809C'), UNHEX('E28094'));
UPDATE table SET column = REPLACE(column, UNHEX('C3A2E282ACE2809D'), UNHEX('E28094'));

为确保一切正常,我拿了一份表格,然后将所有已更改的多字节字符替换为单个字符

UPDATE table SET column = REPLACE(column, UNHEX('E28098'), "'");
UPDATE table SET column = REPLACE(column, UNHEX('E28099'), "'");
UPDATE table SET column = REPLACE(column, UNHEX('E2809C'), '"');
UPDATE table SET column = REPLACE(column, UNHEX('E2809D'), '"');
UPDATE table SET column = REPLACE(column, UNHEX('E28093'), '-');
UPDATE table SET column = REPLACE(column, UNHEX('E28094'), '-');

然后运行此MySQL脚本以捕获仍包含多字节字符的所有记录:

SELECT * FROM table WHERE LENGTH(column) != CHAR_LENGTH(column);

这是我能够快速找到现有数据中的异常情况。

希望这可以帮助其他人尝试跨不同系统传输数据。