MySQL中存储的JSON编码POST的问题

jer*_*iuh 2 php mysql perl json collation

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

问题是í和é等重音字符.一个例子是Matí编码为Mat\ud873.

目前尚不清楚环境中可能发生的变化.涉及PHP,Perl和MySQL.表格排序是latin1_swedish_ci,这可能是由一个同事搞砸了.

这对任何人都响铃吗?

Jay*_*and 5

这里的问题是JavaScript端的国际化,而不是数据库表的排序规则.如果之前没有这样的问题,很可能以前没有用户输入国际字符,或者HTML页面的字符集是ISO-8859-1/cp1252(这将限制客户端的POST数据形式.)新的用户或更改的HTML标头可能导致此问题显现,但问题实际上是在Perl脚本的一侧.

当需要超过7位编码时,JSON 将字符串定义为具有Unicode转义序列的双引号字符集.前127个ISO-8859-1字符可以按原样表示,但任何扩展的ASCII /多字节字符最终都将作为\ uXXXX值.例如,字符é(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,因此您有以下选项:

  1. 将特殊字符转换为HTML实体(htmlentities())
  2. 强制所有特殊字符从UTF-8序列减少(如果那是你的POST数据来自什么),以ISO-8859-1通过utf8_decode() (你可能会丢失数据这种方法)
  3. 通过替换此REGEX匹配来刷新生成的JSON:/ \\ u [a-zA-Z0-9] {4,4}/with""(无)(使用此方法可能会丢失数据)
  4. 通过将所有"\"字符更改为"\\"之前双重转义结果JSON,然后将其提供给Perl脚本(警惕SQL注入!)