我有一个网站我想从迁移的 ISO 以<强> UTF-8

我在由下面的主键索引数据库中的记录:

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

问题是,现在(使用UTF-8)中,当我序列串,我得到:

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

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

因此,这是与非UTF8以前的记录不兼容!

难道我做错了什么?我怎么能解决这个问题?

由于

有帮助吗?

解决方案

的行为是完全正确的。两个字符串与不同的编码将产生不同的字节流,因此具有不同的序列化的字符串。

其他提示

转储数据库中的latin1。

在命令行:

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的工作。

PHP 4和5不具有内置的Unicode支持;我相信PHP 6开始增加更多的Unicode支持,虽然我不知道如何完全是。

要解序列化的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
}

您并没有做错什么。 PHP之前V6只是不是Unicode所知,并且因此不支持它,如果不打它是(即,经由mbstring延伸或其他方式)。

我们在这里写我们自己的身边serialize()包装来解决这个问题。你可以,也转移到其他序列化技术,如JSON(以来5.2.0 json_encode()json_decode()在PHP)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top