正在将数据从latin1字符集迁移到UTF-8


Migrating data, from latin1 charset to UTF-8

我正试图将一些鱼类信息档案从使用latin1字符集的定制CMS转移到使用UTF-8的WordPress定制(自定义帖子类型,具有许多元字段)数据库。

除此之外,旧的CMS使用了一些奇怪的bbCode位。

基本上,我正在寻找一个可以做到这一点的功能:

  • 使用latin1_swedish_ci排序规则(和latin1字符集)从我的旧数据库中获取信息
  • 将所有非标准字符(我们有克罗地亚语、捷克语、西班牙语、法语和德语等语言的字符)转换为á等HTML实体(&134;等数字也可以)
  • 将所有bbCode(见下文)转换为HTML
  • '"转换为HTML实体
  • 将带有utf-8字符集的信息返回到我的新数据库

bbCode tofrom为:

$search = array( '[i]', '[/i]', '[b]', '[/b]', '[pl]', '[/pl]' );
$replace = array( '<i>', '</i>', '<strong>', '</strong>', '', '' );

到目前为止,我尝试过的功能是:

$search = array( '[i]', '[/i]', '[b]', '[/b]', '[pl]', '[/pl]' );
$replace = array( '<i>', '</i>', '<strong>', '</strong>', '', '' );
function _convert($content) { 
    if(!mb_check_encoding($content, 'UTF-8') 
        OR !($content === mb_convert_encoding(mb_convert_encoding($content, 'UTF-32', 'UTF-8' ), 'UTF-8', 'UTF-32'))) { 
        $content = mb_convert_encoding($content, 'UTF-8'); 
        if (mb_check_encoding($content, 'UTF-8')) { 
            return $content;
        } else { 
            echo "<p>Couldn't convert to UTF-8.</p>";
        } 
    } 
} 
function _clean($content) {
    $content = _convert( $content );
    /* edited out because otherwise all HTML appears as &lt;html&gt; rather than <html>
    //$content = htmlentities( $content, ENT_QUOTES, "UTF-8" );
    $content = str_replace( $search, $replace, $content );
    return $content;
}

然而,这会阻止一些字段导入到新数据库,并且不会替换bbCode。

如果我使用以下代码,它大多有效:

$var = str_replace( $search, $replace, htmlentities( $row["var"], ENT_QUOTES, "UTF-8" ) );

然而,某些包含我认为是捷克/克罗地亚字符的字段根本不会出现。

有人对我如何按照上面列出的顺序成功地将信息从"旧格式"转换为新格式有什么建议吗?

我想说,如果你想转换所有非ASCII字符,你就不需要进行任何latin1UTF-8的转换了。假设您在数据上运行htmlspecialcharshtmlentities之类的函数,那么所有非ASCII字符都将被替换为相应的实体代码。

基本上,在这个步骤之后,应该不会有任何需要转换为UTF-8的字符了。此外,如果您想将latin1编码字符串转换为UTF-8,我强烈怀疑utf8_encode会很好。

PS。当涉及到将bbCode转换为HTML时,我建议使用正则表达式。例如,你可以在一行中完成这一切:

$html_data = preg_replace('/'[(/?[a-z]+)']/i', '<$1>', $bb_code_data);