2-3%的时间出现错误的字符编码

时间:2018-10-19 18:12:08

标签: php mysql forms character-encoding

我有一个PHP表单,可将​​数据提交给MySQL。

查看数据库中的数据,我可以看到大约2-3%的行包含国际字符,这些国际字符的编码不正确,例如“Guðrún”显示为“Guðrún”。

但是,另一位用户可能会在几分钟后提交相同的字符,在这种情况下,字符已正确编码

因此,编码似乎取决于所使用的计算机或我不知道的其他因素。

在HTML的开头,我有这个:

<form autocomplete="on" method="post" action="index.php" id="form1" accept-charset="ISO-8859-1">

表单具有以下内容:

xAxes: [{
        display: true,
        position: 'bottom',
        ticks: {
          autoSkip: true
        }
}]}

MySQL列设置为latin1_swedish_ci。

还有什么我需要做的事情才能使每个人都可以使用吗?

编辑:由于已被标记为重复 我在其他任何地方都找不到这个问题的答案。我已经阅读了很多有关字符编码的信息,这使我拥有了当前的设置,但这并不能解释为什么2-3%的数据与其余数据的行为有所不同。

1 个答案:

答案 0 :(得分:0)

这种类型的错误称为Mojibake。 here

讨论了其原因

但是...您似乎暗示某些具有Mojibake,而其他具有很好的重音字符?如果是这种情况,那就是客户端错误-一些客户端使用latin1,一些客户端使用utf8。在此级别混合不好

但是,如果您以这种方式混合使用,请确保每个客户端都宣布适合其字节的CHARACTER SET。最好通过连接参数来完成,但是也可以通过SET NAMES ...来完成。这是some rambling notes on PHP

由于eth中确实存在latin1和u-acute,因此表列和/或客户端可能设置为latin1或utf8mb4的可能性很大,您可以考虑将utf8移至面向未来的数据库。

“来回更改”可能很危险-尤其是如果您使用“错误” ALTER。请提供SELECT col, HEX(col) ...Guðrún的十六进制:

if latin1:           47 75     F0    72     FA    6E
if utf8/utf8mb4:     47 75    C3B0   72    C3BA   6E
if 'double encoded': 47 75 C383 C2B0 72 C383 C2BA 6E