我最近有一些访问者使用以下useragent:
Mozilla/5.0 (Linux; U; Android 2.3.6; es-co; XT320 Build/GRK39F)
AppleWebKit/533.1 (KHTML, like Gecko) Versión/4.0 Mobile Safari/533.1
我将这些插入到utf8_general_ci列的mysql表中。我的PHP站点也用作UTF-8。 不幸的是,我从这些访问者那里得到了一些错误,如下所示:
Incorrect string value: '\xF3n/4.0...' for column 'useragent' at row 1 [1366]
因此导致问题的是ó。 在我解决这个问题的过程中,我将firefox浏览器的useragent改为了这个(使用UA切换器插件),但是它会完全插入到我的数据库中。
所以,我的问题是:在某些情况下,它有可能显然无效吗?这怎么可以解决? 我当然可以用o替换ó,但我认为这不会是我将来会遇到的最后一个特殊字符......
答案 0 :(得分:1)
您的数据库可能希望发送UTF-8编码数据,但用户代理用Latin-1或其他一些专门编码进行了莫名其妙的编码。这个应该不是,因为HTTP标头不应该使用非ASCII字符,因为没有机制来指定如何编码HTTP标头,因此无法知道正在处理的编码。
您找到了一个不合规的用户代理。你应该检查所有收到的字符串是否符合你预期的编码;例如使用mb_check_encoding($str, 'UTF-8')
。如果字符串不是预期的编码,那么所有的赌注都会关闭,你可以做任何你觉得正确的事情。丢弃字符串,尝试猜测其编码并将其转换,替换无效字节或其他任何您想要的字符。
答案 1 :(得分:0)
是否可以使用来自用户的重写代码页生成字符串。你可以尝试
$Str = mb_convert_encoding ( string , "auto", "UTF-8")
在将其发送到数据库之前