utf8中'混乱的字符'列表

时间:2011-05-12 09:26:55

标签: php utf-8 character-encoding special-characters

我的一个客户有一个网站,主机公司已经完全搞砸了强制完整数据库上的字符集。我们之前遇到过字符集问题,但现在它只是一场戏剧性的直播!

到目前为止,我已将charset = utf-8添加到页面内容类型,并将mysql连接的charset设置为utf8。现在是时候替换所有角色了。到目前为止,我发现的是:

ö = ö
ë = ë
é = é

数据库中的数据正在更新,如下所示:

UPDATE table SET `fieldname` = REPLACE(`fieldname`, 'ö', 'ö');

现在我只需要查找搞砸了的完整列表。我尝试了一个搜索field LIKE '%Ã%'的MySQL查询,但这会返回数据库中的所有记录。

谷歌也只是在其他有麻烦的人的主题中显示了几个角色(大多数是上面的3个角色),但似乎没有一个完整的这些角色列表(或者至少是最常见的)我可以用于查找和替换我的客户的所有数据。

如果有人知道这样的位置或者能够完成我的列表,我将作为回报创建一个包含这些字符的页面以帮助其他人(除非已经有一个我不知道某个地方的列表)。

// EDIT

这将是最常见的欧洲人物,如éèë,áàä,öóò,ï,ü,也许是ringel-S(德国双S)。对于像ñ或ã这样的耸人听闻的标志而言,并非如此,但如果它们在某个地方的列表中会非常受欢迎。

// EDIT 2

我使用本文第1部分中的2个ALTER查询更新了MySQL数据库和表:http://developer.loftdigital.com/blog/php-utf-8-cheatsheet。到目前为止,我没有使用mb_函数,也没有像看起来那样进行任何MB配置。

文件中的标题都设置为utf-8(我仍然需要检查一些ajax脚本的标题,不确定是否需要,但这样做不会有害)。并且文件全部保存为UTF8而没有BOM。此外,通过将字符集设置为utf-8来更新PHPFreakMailer。

Bad enough,我还有这些奇怪的角色。我不认为他们会自己离开,但至少值得希望如此:-)那么我应该采取的最后一步是什么?继续使用REPLACE查询并手动更改所有奇怪的字符?

提前致谢!

4 个答案:

答案 0 :(得分:3)

这有点疯狂;你认为“¶”是什么字符集?

看起来它实际上是一个正确的UTF-8序列(因为它是两个字节),你只是将它显示为ISO-8559-1。

修改

根据您的评论,我认为以下情况正在进行:

认为(但实际上并非100%确定)正确的UTF-8二进制序列存储在数据库中。但由于该表标记为ISO-8559-1,并且您要求自动转换字符集。所以它认为它是ISO-8559-1(看起来像¶),但后来尝试将其转换为UTF-8。

如果strlen('Ã'')是4而不是2,你应该能够验证这一点。如果长度确实为2,那么你的浏览器编码会以某种方式搞砸。

要解决此问题,请不要将MySQL设置为对字符进行编码。

选项2

数据也可以在表格中“双重编码”。要检查这一点,只需检查数据库上的字符串长度。如果'¶'是4个字节长,那就是问题。

我在这种情况下的建议是不要试图制作一个大的“混乱的角色”地图。你应该只需要'utf8_decode'字符串。通常这个函数会输出一个ISO-8559-1字符串,但在你的情况下..它应该是原来有效的UTF-8字符串。

我希望这有效!

<强> EDIT2

确实如此有效我认为发生的是选项2.用简单的(php)术语表示:

$output = utf8_encode(utf8_encode('string'));

所以一个utf8_decode()就足够了。

在运行迁移脚本之前,请先测试一下:)

答案 1 :(得分:1)

如果他们强制改变角色,为什么你的数据库没有被转换?您的表格仍然是旧的字符集(请参阅表格信息中的phpMyAdmin)。

如果数据显示在您的phpMyAdmin中或仅显示在您的网页上,数据是否有误? - &GT;你的名字和校对应该改变,标题和文件类型(安全文件为utf-8)。

或尝试:

ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

只有当MySQL内没有选项时,我才会开始替换字符。

答案 2 :(得分:1)

既然你用“php”标记了这个问题,我假设你用PHP读取数据库及其值?如果是这样,如果您无法再控制数据库,请查看mb_convert_encoding

更好的解决方案是修复数据和表格字符集之间的不一致。备份数据库(以防万一),并将所有表列更改为UTF-8。 注意:使用MySQL时,不够来更改表格的字符集,您必须按列进行此操作。

答案 3 :(得分:-1)

为什么不使用:&auml; = ä&ouml; = ö,...

在php中执行htmlentities();,它会将所有特殊字符转换为实体。我认为这是最简单的方法。