代码之家  ›  专栏  ›  技术社区  ›  Matthieu Napoli

php序列化函数是否与utf-8兼容?

  •  5
  • Matthieu Napoli  · 技术社区  · 15 年前

    我有一个要迁移的站点 国际标准化组织 UTF-8 .

    我在数据库中有一个按以下主键索引的记录:

    s:22:"Informations générales";
    

    问题是,现在(使用utf-8),当我序列化字符串时,得到:

    s:24:"Informations générales";
    

    (注意字符串的大小现在是字节数,而不是字符串长度)

    所以这与非utf8以前的记录不兼容!

    我做错什么了吗?我该怎么解决?

    谢谢

    5 回复  |  直到 12 年前
        1
  •  2
  •   soulmerge    15 年前

    行为完全正确。两个不同编码的字符串将生成不同的字节流,从而产生不同的序列化字符串。

        2
  •  4
  •   Rulo    14 年前

    用拉丁语1转储数据库。

    在命令行中:

    sed  -e 's/latin1/utf8/g' -i ./DBNAME.sql
    

    将转换后的文件导入到utf-8格式的新数据库。

    使用php脚本更新每个字段。 进行查询,遍历每个字段并使用以下命令更新序列化字符串:

    $str = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $str);
    

    之后,我就可以使用unserialize()和utf-8的所有功能。

        3
  •  1
  •   Amber    15 年前

    php 4和php 5没有内置的unicode支持;我相信php 6已经开始添加更多的unicode支持,尽管我不确定这有多完整。

        4
  •  1
  •   sunfish    12 年前

    要取消对UTF-8编码的序列化数组的序列化,请执行以下操作:

    $array = @unserialize($arrayFromDatabase);
    if ($array === false) {
      $array =  @unserialize(utf8_decode($arrayFromDatabase)); //decode first
      $array = array_map('utf8_encode', $array ); // encode the array again
    }
    
        5
  •  0
  •   Boldewyn    15 年前

    你没做错什么。v6之前的php不支持unicode,因此也不支持它,如果您不想超过它(例如,通过 mbstring 延伸或其他方式)。

    我们在这里写了自己的包装 serialize() 来弥补这一点。您也可以使用其他序列化技术,如json(使用 json_encode() json_decode() 从5.2.0开始使用php)。

    推荐文章