我正试图将一些鱼类信息档案从使用latin1
字符集的定制CMS转移到使用UTF-8
的WordPress定制(自定义帖子类型,具有许多元字段)数据库。
除此之外,旧的CMS使用了一些奇怪的bbCode位。
基本上,我正在寻找一个可以做到这一点的功能:
- 使用
latin1_swedish_ci
排序规则(和latin1
字符集)从我的旧数据库中获取信息 - 将所有非标准字符(我们有克罗地亚语、捷克语、西班牙语、法语和德语等语言的字符)转换为
á
等HTML实体(&134;
等数字也可以) - 将所有bbCode(见下文)转换为HTML
- 将
'
和"
转换为HTML实体 - 将带有
utf-8
字符集的信息返回到我的新数据库
bbCode to
和from
为:
$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 <html> 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字符,你就不需要进行任何latin1
到UTF-8
的转换了。假设您在数据上运行htmlspecialchars
或htmlentities
之类的函数,那么所有非ASCII字符都将被替换为相应的实体代码。
基本上,在这个步骤之后,应该不会有任何需要转换为UTF-8
的字符了。此外,如果您想将latin1
编码字符串转换为UTF-8
,我强烈怀疑utf8_encode
会很好。
PS。当涉及到将bbCode
转换为HTML
时,我建议使用正则表达式。例如,你可以在一行中完成这一切:
$html_data = preg_replace('/'[(/?[a-z]+)']/i', '<$1>', $bb_code_data);