Как перекодировать кракозябры при ошибке конвертации utf 8 сз1251
Перейти к содержимому

Как перекодировать кракозябры при ошибке конвертации utf 8 сз1251

  • автор:

Как перекодировать кракозябры при ошибке конвертации utf 8 сз1251

О том, как перевести сайт и базу данных из кодировки windows-1251 в кодировку utf-8, уже рассказывалось неоднократно. Это можно сделать средствами самой DLE. Данная статья предназначена для тех, кто хочет перевести сайт из кодировки utf-8 в кодировку windows—1251. Cделать это сравнительно легко в «домашних» условиях без обращений к техподдержке хостинга или без самостоятельных дополнительных манипуляций на своем сервере. Надеюсь, она поможет тем, кто по каким-то причинам разочаровался в кодировке utf-8 и решил вернуться к windows-1251.

Для начала вам нужно сделать дамп базы данных вашего сайта (можно, и даже лучше, средствами самого движка через админпанель сайта), которые работают в кодировке utf-8, и скачать этот дамп себе на локальный компьютер.

Перед тем как начать заниматься базой данных, вам нужно будет удалить файлы дистрибутива старого сайта в кодировке utf-8 и проинсталлировать по новой дистрибутив DLE в кодировке windows-1251. От старого дистрибутива вам нужно оставить на хостинге (НЕ УДАЛЯТЬ. ) папку uploads и все файлы в ней. Также, скачайте к себе на компьютер папку с вашим рабочим шаблоном и папку engine/data со всеми файлами конфигурации сайта — они вам понадобятся, чтобы не вводить все настройки заново после установки DLE в кодировке windows-1251.

Базу данных на хостинге можно оставить прежнюю, но из неё нужно будет удалить все таблицы, оставив её полностью пустой. Затем через phpmyadmin вам будет нужно на вкладке «Операции» выставить «Сравнение» cp1251_general_ci для этой базы данных.

Конвертирование базы данных DLE из utf-8 в windows-1251

Для самого сайта, чтобы не было проблем с отображением кодировки в браузерах, в вашей панели управления на хостинге нужно будет выставить для вашего домена кодировку windows-1251 перед началом работ. Теперь можно проинсталлировать DLE в кодировке windows-1251 в вашу пустую базу данных. При установке укажите префикс таблиц, все логины и пароли к админке сайта и базе данных точно такими же, какие они у вас были до этого в прежней базе данных и сайте на utf-8. Это поможет вам избежать проблем и непонятных вам ситуаций в дальнейшем.

Теперь займемся самой базой данных.
Распакуем архив с базой данных архиватором, например WinRAR. У вас получится файл с расширением .sql. Откроем его с помощью бесплатного текстового редактора Notepad++ (он поддерживает достаточно большие файлы, если кто-то беспокоится из-за размера своего дампа базы данных). В правом нижнем углу окна Notepad++ будет видна кодировка «UNIX ANSI as UTF-8».

Конвертировать базу данных будем в два этапа.
— Первый этап
Для начала нам нужно сменить название кодировки с utf-8 на windows-1251 по всей базе данных для всех таблиц. Для этого вызываем диалог поиска и замены в Notepad++ и будем менять текст в базе данных с utf8 на cp1251 , как на скриншоте.

Нажимаем «Заменить всё» и после нажимаем «Сохранить изменения» (иконка дискеты). Для DLE 9.5 на данный момент таблиц должно быть 35 и столько же должно быть произведено замен (см. скриншот).

— Второй этап
Теперь нам нужно конвертировать саму базу данных в windows-1251. Чтобы сохранить кириллицу кириллицей, без всяких крякозяблов, делаем следующее.
Нажимаем кнопку «Кодировка» в меню Notepad++ и затем в выпадающем меню выбираем «Преобразовать в ANSI».

Ждем пока Notepad++ закончит эту операцию (на больших базах это может занять время) и после этого нажимаем снова «Сохранить изменения» (иконка дискеты).
Если вы сделали все именно так, то кириллица в вашей базе данных сохранилась без изменений, а в правом нижнем углу окна Notepad++ будет видна кодировка «UNIX ANSI».

Ваша новая база данных в кодировке windows-1251 готова. Теперь вы можете упаковать её в zip архив, чтобы уберечь от возможных повреждений при загрузке на хостинг, и загрузить в папку backup вашего свежеустановленного сайта, где уже распакуете этот архив через панель управления хостингом (ISPManager или аналогичные). После этого вы сможете восстановить базу данных стандартными средствами движка через админпанель сайта в разделе «Управление базой данных». После восстановления базы данных не забудьте в разделе «Категории» нажать кнопку «Отсортировать категории». Вот, собственно, и все премудрости, теперь у вас и сайт, и база данных в кодировке windows-1251.
Если вы прислушались к моему совету при новой установке DLE в кодировке windows-1251 сохранить префиксы таблиц, а также логины и пароли к базе данных и админке сайта прежними, то вы без проблем войдете на сайт после восстановления нашей измененной базы данных.

Для того, чтобы вам вернуть все настройки (не зря я говорил о необходимости сохранить все файлы из папки engine/data), откройте сохраненный файл config.php, найдите строчку

'charset' => "utf-8",

и замените её на

'charset' => "windows-1251",

и затем нажимаем «Сохранить изменения» (иконка дискеты). Чтобы перевести этот файл с настройками из кодировки utf-8 в windows-1251 проделываем все то же самое, как и с базой данных, и после снова нажимаем «Сохранить изменения» (иконка дискеты). В правом нижнем углу окна Notepad++ будет видна кодировка «UNIX ANSI». Можете загрузить теперь этот файл config.php к себе на сайт в папку data — все настройки и кодировка будут сохранены. Если остальные файлы из старой папки data у вас тоже изменялись на хостинге, то проделываете с каждым нужным вам из них все те же действия, а после загружаете к себе на сайт в папку data.

С шаблоном нужно сделать то же самое — все файлы стилей .css и шаблонов .tpl нужно перевести в кодировку windows-1251 при помощи Notepad++ по тому же принципу, а после загрузить к себе на сайт в папку с шаблонами. Не забудьте выставить права на файлы в соответствии с документацией к DLE.

Ну вот и все. Надеюсь, что эта информация будет для кого-то полезной. Помните, что чтобы избежать ошибок с конвертированием файлов и базы данных, все операции нужно делать с точностью и в два этапа, как описано выше.

Проблемы при попытке перевести проект в кодировку UTF-8

Пришла задача привести проект самописной CMS в PSR-12, а значит кодировка файлов приложения должна быть UTF-8 (No BOM). Я, с помощью PHPStorm, разом перевел все документы в UTF-8 (settings -> editor -> File Encoding -> Ставлю UTF-8 -> в таблицу добавляю директорию проекта -> with NO BOM -> Apply). Частично проект был написан на Windows-1251,по- этому многие файлы внутри теперь содержат строки с абра-кадабрами и вообще на сайте достаточно криво отображаются. Подскажите пожалуйста, как можно это исправить и как правильно было бы переводить файлы из 1251 в UTF? UPD: На сколько я понял, IDE мне не меняет кодировку файлов, а только временно ее использует, тогда остается вопрос, как поменять кодировку всего проекта (он очень большой), и при этом не получить каракули? UPD2: В целом нашел скрипт, который мне помог конвертировать весь проект с помощью функции iconv() Однако теперь появилась ошибка Fatal error: Uncaught Error: Class «PHPExcel_Shared_String» not found in . /Autoloader.php:11 UPD3: Нашел ошибку: некоторые файлы после конвертации почему- то становятся пустыми. Код обработчика прикрепляю. Помогите пожалуйста.

  array('mod', 'lib/scripts'), 'file' => array('lib/index.php')) // $convert . - флаг (1 перезаписывать файлы, 0 - только прочитать/проверить доступ на запись) // $result . - стоит оставить пустым, используется для передачи данных при рекурсивном проходе директорий // Результат выполнения - $result = win1251_to_utf8() // $result['output_txt'] . - текстовый вывод в HTML результатов выполнения функции: черный цвет - найденный файл подлежит конвертации (расширение есть в массиве), серый цвет - не подлежит function win1251_to_utf8($source, $ext_convert = array(), $exclude = array('file' => array(), 'dir' => array()), $convert = 0, $result = array()) < if (!isset($result['source']['dir'])) < $result['source']['dir'] = $source; $result['source']['strlen'] = mb_strlen($source); >if ($paths = array_diff(scandir($source), array('..', '.'))) < foreach($paths as $path) < if (is_dir($source.'/'.$path)) < // Обработка исключений if (!in_array($source.'/'.$path, $exclude['dir'])) < $result = win1251_to_utf8($source.'/'.$path, $ext_convert, $exclude, $convert, $result); >> else < if (!in_array($source.'/'.$path, $exclude['file'])) < // Только файлы с определенными расширениями foreach ($ext_convert AS $key =>$ext) $tmp .= '(?:\.'.$ext.')|'; $tmp = substr($tmp, 0, -1); $pattern = '~'.$tmp.'$~i'; $result['counter_files']++; if (preg_match($pattern, $source.'/'.$path)) < $file_content = file_get_contents($source.'/'.$path); // Перекодировка $fs1 = filesize($source.'/'.$path); if ($convert == 1) < // Проверка на доступность файла для записи if (!is_writable($source.'/'.$path)) < $result['output_txt'] .= '
'.$result['counter_files'].'. Ошибка: '.$source.'/'.$path.' не доступен для записи, конвертация остановлена.
'; return $result; > $file_content = iconv('windows-1251', 'utf-8', $file_content); file_put_contents($source.'/'.$path, $file_content); $fs2 = filesize($source.'/'.$path); if ($fs1 != $fs2) $result['output_txt'] .= '
'.$result['counter_files'].'. Ошибка: '.$source.'/'.$path.' ('.$fs1.' != '.$fs2.')
'; else $result['output_txt'] .= '
'.$result['counter_files'].'. '.$source.'/'.$path.'
'; > else < if (!is_writable($source.'/'.$path)) $result['output_txt'] .= '
'.$result['counter_files'].'. Ошибка: '.$source.'/'.$path.' не доступен для записи.
'; else $result['output_txt'] .= '
'.$result['counter_files'].'. '.$source.'/'.$path.'
'; > $result['path']['conv_file_path'][] = $source.'/'.$path; > else < $result['output_txt'] .= '
'.$result['counter_files'].'. '.$source.'/'.$path.'
'; > > > > > return $result; > $source = __DIR__ . '/utf/ssl'; $convert = 0; $ext_convert = array('php', 'inc', 'html', 'htm'); $exclude_dir = array($source.'/js', $source.'/img'); // Директории, файлы в которых конвертировать не нужно $exclude_file = array($source.'/!capcha.php'); // файлы, которые конвертировать не нужно $exclude = array('file' => $exclude_file, 'dir' => $exclude_dir); $result_func = win1251_to_utf8($source, $ext_convert, $exclude, $convert); echo ' Конвертация файлов '.$result_func['output_txt'].' '; ?>

Как преобразовать текст из кодировки Windows-1252 в UTF-8?

Дело в том, что строка Ìåòðî Ïëàíåðíàÿ 474 ì не может быть конвертирована корректно, так как коды символов (очевидно, в Win-1251) были уже однажды некорректно интерпретированы, как коды символов в Win-1252. Вам нужно взять эту строку, (опционально, если ваш файл уже в Unicode — вернуть строку в двухбайтовую кодировку), и интерпретировать, как строку в Win-1251, а не конвертировать, как строку в какой-то кодировке, а интерпретировать ее правильно.

Решения вопроса 2

DevMan

вы делаете ту же ошибку, что и в предыдущих вопросах по парсингу: работаете с уже интерпретированными данными вместо сырых.
когда вы в файле пишите $metro = ‘Ìåòðî Ïëàíåðíàÿ 474 ì’; строка приобретает кодировку этого файла, а не исходную, соответственно, любые камлания по конвертации лишены всякого смысла.

Ответ написан более трёх лет назад
Комментировать
Нравится 6 Комментировать
Для быстрого фикса

$metro = 'Ìåòðî Ïëàíåðíàÿ 474 ì'; $metro = iconv('UTF-8', 'CP1252', $metro); $metro = iconv('CP1251', 'UTF-8', $metro); var_dump($metro);

string(36) «Метро Планерная 474 м»
Однако вам нужно искать проблему, а не рисовать костыли.
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ответы на вопрос 1

profesor08

profesor08 @profesor08 Куратор тега PHP

Пересохрани все свои файлы в кодировку UTF-8. Документу укажи кодировку UTF-8. Вот после этих действий, ты можешь начинать играться с конвертацией кодировок. mb_detect_encoding поможет узнать в какой кодировке получившийся текст, если вдруг что-то пошло не так.

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

php

  • PHP
  • +1 ещё

Как настроить карусель в WordPress при добавлении нового типа поста с классами Bootstrap (active)?

  • 1 подписчик
  • вчера
  • 21 просмотр

UTF перекодировка

Всем привет. Возникла проблемка, вот хотелось бы спросить знающих людей, да и возможно поможет ещё кому.

Есть сервер, настроенный под UTF, и залитые скрипты отображают всю кириллицу в Win1251 крякозябрами, и автораспознование кодировки в браузере не работает (приходится в ручную переключать КАЖДУЮ страницу), все отображается чудесными вопросиками и квадратиками, которые мне несомненно не совсем нравится. Выход конечно был найден — все файлы с кириллицей перекодировать из Win1251 в UTF-8, но вот незадача — в Dreamweaver не то что бы удобно совершать данные действия, и когда нужно перекодировать несколько сотен файлов движка — этот метод не катит.

Разумеется я попытался поискать пакетный перекодирофчег, парочку нашел — но после перекодирования все PHP скрипты резко стали нерабочими. Вот собственно и сама суть — посоветуйте что можно сделать в моей ситуации, или конкретный перекодировщик Win1251->UTF, который может нормально перекодировать PHP.

Надеюсь на помощь, совет и понимание, и совсем не против если ету «новость» минуснут 🙂 Но я уверен что совет по этой теме поможет многим в благом деле — переводе всего и вся в UTF.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *