2009-09-12 78 views
1

直到最近,我的博客还使用了PHP和MySQL不匹配的字符编码设置。我已经解决了潜在的问题,但我仍然有大量充满垃圾的文本。例如,ï已变成ï如何恢复通过字符编码wringer发送的文档?

是否有软件可以使用模式识别和统计来自动发现破损的文本并修复它?

例如,它看起来像U+00EF(UTF-8 0xC3 0xAF)已成为U+00C3 U+00AF(UTF-8 0xC3 0x83 0xC2 0xAF)。换句话说,十六进制编码已被用于代码点。这种模式发生在整个我的网站(看似随机)的非ASCII字符。

回答

0

你可能想看看正则表达式,http://en.wikipedia.org/wiki/Regular_expression。 使用此功能,您可以搜索并替换相关字符。

这里是MySQL的正则表达式文档http://dev.mysql.com/doc/refman/5.1/en/regexp.html

+0

我编辑了我的帖子来澄清:它不只是这个字符。 我的意思是,我当然可以转储数据库,找到所有非ASCII字符序列,找到它们的原始值(在适当的情况下)并在整个文件中直接查找和替换...但我正在寻找更一般的解决方案 – phyzome 2009-09-14 14:03:45

1

你引用的例子看起来像是一个很好的旧的utf8-over-latin1。您可以快速尝试如下查询:

select convert(convert(the_problem_column using binary) using utf8) 

看看它是否解决了问题。

只要所有数据都经历了相同的编码转换序列,只要没有一个转换是有损失的,那么沿着这些行的编码转换就应该起作用 - 您只是逆转其中一些转换的效果转换。

如果你不能依赖经过同一组编码转换的数据,那么它就是扫描数据中的垃圾字符并用预期的字符替换它们,这是有风险的,因为它取决于有人对什么是垃圾和目的是什么的定义。

在这个answer关于如何使用手工脚本进行修复的一些讨论。我不知道有一种工具知道全部的自然语言和编码,需要采用更先进的统计方法来发现可能存在的问题,并且建议进行确切的转换以解决问题 - 类似这样的做法会很有用。