Перенос данных из кодировки latin1 в кодировку UTF-8
Я пытаюсь перенести некоторые профили информации о видах рыб из специальной CMS, используя кодировку latin1
, в базу данных WordPress, настроенную (пользовательский тип записи, с множеством мета-полей), которая использует UTF-8
.
Кроме того, старая 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" ) );
Однако некоторые поля, содержащие, как мне кажется, чешские/хорватские символы, вообще не отображаются.
Есть ли у кого-нибудь предложения о том, как я могу в указанном выше порядке успешно преобразовать информацию из "старого формата" в новый?
1 answers
Я бы сказал, что если вы хотите преобразовать все ваши символы, отличные от ASCII, вам не нужно будет делать никаких преобразований latin1
в UTF-8
, что бы то ни было. Допустим, вы запускаете такую функцию, как htmlspecialchars
или htmlentities
для своих данных, тогда все символы, отличные от ASCII, будут заменены соответствующим кодом сущности.
В принципе, после этого шага не должно остаться символов, которые необходимо преобразовать в UTF-8
. Кроме того, если вы хотите преобразовать свою строку кодировки latin1
в UTF-8
, я сильно подозреваю, что utf8_encode
будет просто отлично.
ПС. Когда дело доходит до преобразования bbCode
в HTML
Я бы рекомендовал вместо этого использовать регулярные выражения. Например, вы могли бы сделать все это в такой строке:
$html_data = preg_replace('/\[(/?[a-z]+)\]/i', '<$1>', $bb_code_data);