【发布时间】:2015-08-29 01:16:54
【问题描述】:
我有一个带有“应该”包含 UTF8 编码数据的 MYSQL 数据库的 PHP 应用程序。关于 unicode 字符,我的应用程序似乎从头到尾都能正常工作。如果有人将“Strömgren”提交到我的数据库中(通过 HTML 表单),当我取回数据时,我会看到“Strömgren”,等等。
我的数据库表都是 UTF8,我的 html 页面和表单都是 charset=utf-8。
我最近注意到,在我的应用程序的一部分中,我的 unicode 字符似乎是双重编码的。当我显示应该是 Strömgren 时,我看到了 Strömgren -- Str\xc3\xb6mgren vs Str\xc3\x83\xc2\xb6mgren。如果我 utf8_decode 坏字符串,它看起来又是正确的。
我假设这是“双重编码”。
我发现显示双重编码数据的应用程序部分正在使用不同的代码来建立其数据库连接,并且该代码正在进行此调用:
$db->set_charset("utf8")
我本来打算对我的所有数据库连接都这样做,但不知何故最终只在一个地方这样做。所以,几乎我所有的应用程序都在使用没有 set_charset 命令的连接,并且 Strömgren 总是看起来正确,并且只有一段代码确实有 set_charset("utf8") (并且只从数据库中读取,从不写入它),显示不正确。
我不确定这是怎么回事,但我怀疑我的数据库中的数据并没有真正以 UTF8 编码存储?也许当我发送它Strömgren(没有set_charset(“utf8”))时,它认为它正在接收latin1(或其他),当我读回它时我得到latin1,但因为我的html页面有“charset = utf -8" 当数据库真的认为它正在向我发送 Strömgren 时,它被“错误显示”为 Strömgren。 (我可能没有正确或清楚地说,但我希望它可以被理解。)
我有两个问题:
首先,我在这里的任何想法是否有道理,或者我完全脱离了基础?
其次,确定数据库中的数据是否编码错误(即数据库实际上包含 Strömgren 还是 Strömgren)的最佳方法是什么?
【问题讨论】:
-
阅读此页面后,我更加确信我的数据库中充满了不良数据:artur.ejsmont.org/blog/content/…