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

Php 将数据从latin1字符集迁移到UTF-8,php,wordpress,migration,Php,Wordpress,Migration,我正在尝试将一些鱼类物种信息档案从使用latin1字符集的定制CMS转移到使用UTF-8的WordPress定制(自定义帖子类型,具有许多元字段)数据库 除此之外,旧的CMS使用一些奇怪的bbCode位 基本上,我正在寻找一个函数来实现这一点: 使用latin1\u swedish\u cicollation(和latin1charset)从我的旧数据库中获取信息 将所有非标准字符(我们有来自克罗地亚语、捷克语、西班牙语、法语和德语等语言的字符)转换为HTML实体,如á(像&134

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

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

基本上,我正在寻找一个函数来实现这一点:

  • 使用
    latin1\u swedish\u ci
    collation(和
    latin1
    charset)从我的旧数据库中获取信息
  • 将所有非标准字符(我们有来自克罗地亚语、捷克语、西班牙语、法语和德语等语言的字符)转换为HTML实体,如
    á(像
    &134;
    这样的数字也很好)
  • 将所有bbCode(见下文)转换为HTML
  • 转换为HTML实体
  • 将带有
    utf-8
    字符集的信息返回到我的新数据库
bbCode
为:

$search = array( '[i]', '[/i]', '[b]', '[/b]', '[pl]', '[/pl]' );
$replace = array( '<i>', '</i>', '<strong>', '</strong>', '', '' );
$search=array(“[i]”、“[/i]”、“[b]”、“[/b]”、“[pl]”、“[/pl]”);
$replace=数组(“”,“”,“”,“”,”);
到目前为止,我尝试的功能是:

$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;
}
$search=array(“[i]”、“[/i]”、“[b]”、“[/b]”、“[pl]”、“[/pl]”);
$replace=数组(“”,“”,“”,“”,”);
函数_convert($content){
如果(!mb_check_)编码($content,'UTF-8')
或者!($content===mb_convert_编码(mb_convert_编码($content,'UTF-32','UTF-8'),'UTF-8','UTF-32')){
$content=mb_convert_编码($content,'UTF-8');
if(mb_check_编码($content,'UTF-8')){
返回$content;
}否则{
echo“无法转换为UTF-8。

”; } } } 函数_clean($content){ $content=\u convert($content); /*已编辑掉,因为否则所有HTML都显示为HTML而不是 //$content=htmlentities($content,entu引号,“UTF-8”); $content=str_replace($search,$replace,$content); 返回$content; }
但是,这会阻止某些字段被导入到新数据库,并且不会替换bbCode

如果我使用以下代码,它大部分是有效的:

$var=str\u replace($search,$replace,htmlentities($row[“var”],entu引号,“UTF-8”);

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


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

我想说,如果你想转换所有非ASCII字符,你不需要进行任何
latin1
UTF-8
的转换。假设您在数据上运行一个函数,如
htmlspecialchars
htmllentities
,那么所有非ASCII字符都将替换为相应的实体代码

基本上,在这一步之后,应该没有任何字符需要转换为
UTF-8
。另外,如果您想将
latin1
编码字符串转换为
UTF-8
我强烈怀疑
utf8\u encode
会很好

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

$html_data = preg_replace('/\[(/?[a-z]+)\]/i', '<$1>', $bb_code_data);
$html\u data=preg\u replace('/\[(/?[a-z]+)\]/i',''.$bb\u code\u data);

从拉丁文1转换为
&134并不完全是“使用UTF-8”。为什么是这个而不是真正的UTF-8?我必须承认我对字符集一无所知,也不了解它们的工作方式。这篇文章背后的“关键事实”本质上是这样的:当我迁移到我的新数据库时,某些字段没有被WordPress识别。当我把问题缩小后,我发现是非标准字符造成了问题。进一步研究后,我推测——在这篇文章[]的指导下——这可能是因为字符集的差异。