Php MySQL中存储的JSON编码帖子存在问题

Php MySQL中存储的JSON编码帖子存在问题,php,mysql,perl,json,collation,Php,Mysql,Perl,Json,Collation,我遇到过这样一种情况,经过几年的使用,我们突然有了一些JSON编码的值,由于反斜杠,这些值使我们的Perl脚本适合 问题在于像í和é这样的重音字符。例如,Matí编码为Mat\ud873 目前尚不清楚环境中可能发生了什么变化。其中包括PHP、Perl和MySQL。表格的排序规则是拉丁文1_瑞典语ci,这可能是由一位同事随意更改的 这是否给任何人敲响了警钟?这里的问题是JavaScript端的国际化,而不是DB表的排序规则。如果您以前没有遇到过此类问题,那么很可能以前没有用户输入国际字符,或者HT

我遇到过这样一种情况,经过几年的使用,我们突然有了一些JSON编码的值,由于反斜杠,这些值使我们的Perl脚本适合

问题在于像í和é这样的重音字符。例如,Matí编码为Mat\ud873

目前尚不清楚环境中可能发生了什么变化。其中包括PHP、Perl和MySQL。表格的排序规则是拉丁文1_瑞典语ci,这可能是由一位同事随意更改的


这是否给任何人敲响了警钟?

这里的问题是JavaScript端的国际化,而不是DB表的排序规则。如果您以前没有遇到过此类问题,那么很可能以前没有用户输入国际字符,或者HTML页面的字符集是ISO-8859-1/cp1252,这将限制客户端的表单POST数据。新用户或更改的HTML头可能会导致此问题出现,但问题实际上是在Perl脚本方面

需要7位以上编码时使用JSON。前127个字符可以按原样表示,但任何扩展ASCII/多字节字符都将以\uxxx值结束。例如,字符ée-acute(在ISO-8859-1中为233)将显示为\u00E9,因为在Unicode中é是U+00E9,字符串résumé将存储为r\u00E9sum\u00E9

由于不知道您的Perl脚本试图做什么,我只能说它在尝试取消引用转义序列时可能遇到困难。Perl有自己的转义序列集,\u mid string实际上意味着将下一个字符改为大写,因此您可能会从Perl脚本中看到很多00E9内容,而不是重音字符,或者根据脚本的不同,您可能会出现解析错误

由于您正在使用PHP从POST数据创建/存储JSON,因此有一些选项:

将特殊字符转换为HTML实体 强制所有特殊字符从UTF-8序列中减少,如果这是您的POST数据通过此方法进入ISO-8859-1的原因,则此方法可能会丢失数据 通过替换此正则表达式匹配项:/\\u[a-zA-Z0-9]{4,4}/来清除生成的JSON。使用这种方法,您可能会丢失数据 在将结果JSON馈送到Perl脚本之前,通过将所有\characters更改为\\来双重转义结果JSON小心SQL注入!
为什么只存储部分代理?嗨,伊格纳西奥,我不确定我是否明白?系统从一个表单获取整个post,并使用Pear模块对整个$\u post进行编码,如so$json->encode$\u post;并存储到mySQL中,供Perl稍后处理。您能告诉我们在所有不同阶段如何输入、编码和存储它吗?U+D873是代理项对的一半。UTF-16中使用代理项对来描述BMP之外的字符。谢谢!这就解释了Perl中的错误:在代理项对中缺少低位代理项字符,在nd\\u9000之前的字符偏移量161处,name\u la…我很确定这是由于环境变化造成的。存储了来自世界各地的178000多份个人提交,我发现了这个问题,因为它导致Perl cron作业抛出了前三年没有出现的错误。我希望避免对数据应用正则表达式,但这可能是我最好的选择。非常感谢您的时间和回复。这无疑帮助我更深入地思考了这一点。在对数据进行JSON加密之前,在PHP端强制进行8位编码可以解决这个问题,同时减少数据丢失。当然,Perl可以处理Unicode,因此教它在内部转换\uxxx引用是最好的选择,并保留所有数据。Jay-Ignacio上面的评论让我终于明白了Perl的抱怨。我以为这是逃避,但这是代理对的问题。我应该删除这个问题并问新问题吗?耶!你救了我一天!我在储存时编码,在迷恋时解码,生活是美好的!非常感谢。