将php序列化字符串转换为utf8的简单方法?

将php序列化字符串转换为utf8的简单方法?,php,serialization,utf,Php,Serialization,Utf,我正在尝试将希腊语数据库转换为utf8。在这一点上,我已经知道如何通过MySQL来实现,而不是通过iconv函数,但我有一个问题:应用程序通过serialize以php序列化格式在数据库中存储大量数据 您可能知道,这种格式将字符串长度存储在序列化字符串中。这意味着,由于php5不正确支持Unicode,因此转换后长度会发生变化,因此这些字符串不能再被取消序列化 到目前为止,我正在考虑使用以下方法之一来解决此问题: 使用PHP将这些字符串转换为utf8,而不是转换整个序列化字符串,而是取消序列化并

我正在尝试将希腊语数据库转换为utf8。在这一点上,我已经知道如何通过MySQL来实现,而不是通过iconv函数,但我有一个问题:应用程序通过serialize以php序列化格式在数据库中存储大量数据

您可能知道,这种格式将字符串长度存储在序列化字符串中。这意味着,由于php5不正确支持Unicode,因此转换后长度会发生变化,因此这些字符串不能再被取消序列化

到目前为止,我正在考虑使用以下方法之一来解决此问题:

使用PHP将这些字符串转换为utf8,而不是转换整个序列化字符串,而是取消序列化并转换数组中的每个项。 编写脚本以重新计算序列化字符串的长度。 选择2似乎更容易,但我认为必须有一个更快的方法来做到这一点。甚至可能是一个免费的脚本来转换它们,因为我肯定不是第一个面对这个问题的人。有什么想法吗


提前感谢。

选项1听起来更简单,我也不太容易出错


您可能只需取消序列化,然后使用array_walk_recursive对每个字符串进行转换

执行SHOW CREATE TABLE并检查表的编码。然后使用相同的编码连接到数据库,并使用“该编码”

现在,当您检索序列化字符串时,请取消序列化它。返回值将是应用程序传递给serialize的任何内容

到达此处后,您需要知道最初插入字符串的编码,例如ISO-8859-1、CP1252等,以便将其转换为utf-8

现在您已经将希腊语转换为utf-8字符串,您可以将其放回数据库

我强烈建议您重新组织数据库,不要使用序列化字符串来存储数据。如果在数据库中存储BLB,请考虑将它们移出数据库并将其存储在文件系统中。
祝你好运。

下面是具体的代码。只需在TODO关键字处插入设置/代码:

//TODO: insert your settings here
$database = 'your_db_name';
$table = 'your_table_name';
$column = 'column_that_needs_conversion';
$primarykey = 'name_of_primary_key_in_that_table';

if (mb_internal_encoding() != 'UTF-8') {
    die('This script must be run in an UTF-8 environment!');
}

$utf8_encode_callback = create_function('&$item,$key', 'if (is_string($item)) $item = utf8_encode($item);');

$tablecol = $table .'.'. $column;
$getvaluesSQL = "SELECT ". $tablecol ." AS thevalue, ". $primarykey ." AS primkey FROM ". $database .".". $table ." WHERE ". $tablecol ." IS NOT NULL AND LENGTH(". $tablecol .") > 0";

//TODO: insert code here for executing $getvaluesSQL against your database

if (mysqli_num_rows($db_getvalues) > 0) {
    while ($getvalues = mysqli_fetch_assoc($db_getvalues)) {
        $php = unserialize(utf8_decode($getvalues['thevalue']));

        if (is_array($php)) {
            array_walk_recursive($php, $utf8_encode_callback);
        } elseif (is_string($php)) {
            $php = utf8_encode($php);
        }

        $new_ser = serialize($php);

        # For checking that conversion happened correctly (compare the two files):
        #file_put_contents('c:/dump0.txt', $getvalues['thevalue'] ."\r\n", FILE_APPEND);
        #file_put_contents('c:/dump1.txt', $new_ser ."\r\n", FILE_APPEND);

        $sql = "UPDATE ". $database .".". $table ." SET ". $tablecol ." = '". sql_esc($new_ser) ."' WHERE ". $primarykey ." = ". $getvalues['primkey'];

        //TODO: insert code here for executing $sql against your database

    }
}
echo '<div>Done with '. $tablecol .'</div>';