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

时间:2010-10-25 19:12:06

标签: php mysql perl json collation

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

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

目前尚不清楚环境可能发生了什么变化。涉及PHP,Perl和MySQL。表格排序是latin1_swedish_ci,这可能是因为一个同事搞砸了。

这会给任何人敲响声吗?

1 个答案:

答案 0 :(得分:5)

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

当需要超过7位编码时,

JSON defines strings as double-quoted sets of characters with Unicode escape sequences。前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数据进入)通过utf8_decode()减少到ISO-8859-1(您可能会丢失数据的方法)
  3. 通过替换此REGEX匹配来刷新生成的JSON:/ \\ u [a-zA-Z0-9] {4,4} / with“”(无)(您可能会丢失数据用这种方法)
  4. 通过将所有“\”字符更改为“\\”,然后将其提供给Perl脚本(警惕SQL注入!),双重转义生成的JSON。