我在PHP中有一个表单,它向MySQL提交数据。
查看数据库中的数据,我可以看到大约2-3%的行包含错误编码的国际字符。“Gu rún”显示为“Gu°r r n”。
但是,另一个用户可能在几分钟后提交相同的字符,在这种情况下,字符被正确编码。
因此,编码似乎依赖于所使用的计算机或其他一些我不知道的因素。
在HTML的头上,我有以下内容:
<meta charset="ISO-8859-1">该表格的内容如下:
<form autocomplete="on" method="post" action="index.php" id="form1" accept-charset="ISO-8859-1">MySQL列被设置为latin1_swedish_ci。
我还应该做些什么来让这件事对每个人都有用吗?
编辑:因为它被标记为重复的,所以我在其他地方找不到这个问题的答案。我已经阅读了很多关于字符编码的信息,这使得我有了目前的设置,但这并不能解释为什么2-3%的数据与其他数据的行为不同。
发布于 2018-10-21 04:20:43
这种类型的错误称为Mojibake。讨论了https://stackoverflow.com/questions/38363566/trouble-with-utf8-characters-what-i-see-is-not-what-i-stored产生的原因
但是..。您似乎暗示有些行具有Mojibake,而其他行则具有良好的重音字符?如果是这样的话,那么这就是一个客户端错误--一些客户机正在使用latin1,有些客户正在使用utf8。在这个层次上混在一起是不好的。
但是,如果确实采用这种方式,请确保每个客户端都会公布适合其字节的CHARACTER SET。这最好通过连接参数来完成,但也可以通过SET NAMES ...完成。这里是http://mysql.rjweb.org/doc.php/charcoll#php
由于eth和u-acute确实存在于latin1中,因此表列和/或客户端可以设置为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 6Ehttps://stackoverflow.com/questions/52897888
复制相似问题