代码之家  ›  专栏  ›  技术社区  ›  jerrygarciuh

MySQL中存储的JSON编码的日志存在问题

  •  2
  • jerrygarciuh  · 技术社区  · 14 年前

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

    这些问题与重音字符有关,如_-和_)。例如,mat_编码为mat\ud873。

    目前尚不清楚环境中可能发生了什么变化。其中包括php、perl和mysql。表的排序规则是拉丁语-瑞典语-ci,这可能是由一个同事胡搞而改变的。

    这能为任何人敲响警钟吗?

    1 回复  |  直到 14 年前
        1
  •  5
  •   Jay Dansand    14 年前

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

    杰森 defines strings as double-quoted sets of characters with Unicode escape sequences 当需要7位以上的编码时。前127 ISO-8859-1 字符可以按原样表示,但任何扩展的ASCII/多字节字符都将以\uxxxx值结尾。例如,ISO-8859-1中的字符_(e-acute),即_233将显示为\u00e9(因为_)是Unicode中的U+00e9),字符串“r_)sum_”将存储为“r\u00e9sum\u00e9”。

    不知道Perl脚本要做什么,我只能说,在尝试取消引用转义序列时可能会遇到困难。Perl有自己的一组转义序列,中间字符串实际上意味着“将下一个字符设为大写”,所以您可能 看到 Perl脚本中有很多“00e9”内容,而不是重音字符,或者根据脚本的不同,您可能会遇到解析错误。

    由于您是从php中的post数据创建/存储json,所以您有一些选项:

    1. 将特殊字符转换为HTML实体( htmlentities() )
    2. 强制所有特殊字符从UTF-8序列(如果您的post数据就是这样的话)减少到ISO-8859-1,通过 utf8_decode() (你 可能丢失数据 使用这种方法)
    3. 通过将此regex match:\\u[a-za-z0-9]4,4/替换为“”(无)来清除结果JSON(您 可能丢失数据 使用这种方法)
    4. 在将结果JSON提供给Perl脚本之前,通过将所有\“字符更改为\ \”来对其进行双重转义。( 小心SQL注入! )