Перенос данных из кодировки 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 &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" ) );

Однако некоторые поля, содержащие, как мне кажется, чешские/хорватские символы, вообще не отображаются.

Есть ли у кого-нибудь предложения о том, как я могу в указанном выше порядке успешно преобразовать информацию из "старого формата" в новый?

Author: dunc, 2012-02-01

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);
 2
Author: Simon, 2012-03-03 11:10:13