О создании сайтов
14.05.2009Кодировка. Изменение кодировки текста
Ключевые слова: кодировка, cp1251, UTF, перекодировка
Полезная статья? — можете поделиться ссылкой или оставить комментарий |
Выделите текст и нажмите на Ctrl+C, чтобы скопировать выделенный текст
Выделите текст и нажмите на Ctrl+C, чтобы скопировать выделенный текст
В Интернете существует достаточно много кодировок для передачи текста. Это создаёт некоторые ограничения и сложности в обмене информацией между сайтами, базами данных и другими интернет-ресурсами. Кодировка текста, с которой работает клиентское приложение, может не совпадать с кодировкой, передаваемой сервером. В результате при отображении данных могут «биться» некоторые буквы (например, «ш» или «и») в текстах или, вообще, показываться одни нечитаемые «кракозябры». Разработчики сайтов частенько сталкиваются с ситуацией, когда нужно перекодировать текст из одной кодировки в другую (например, из кодировки «cp1251» в «UTF»). Разберёмся в этом вопросе вместе.
Распространённые кодировки текста
Используемых в Интернете кодировок очень много. Для русскоязычных текстов чаще всего используется кодировка «win1251» (в некоторых программах, например, базе данных «MySql» она же обозначается как «cp1251»). В почтовых программах для отправки электронных писем может применяться кодировка «koi8». Использование этих и других разнообразных кодировок идёт ещё с давних времён, что иногда создаёт проблемы с кодировкой в настоящем.
Недавно разработанная универсальная кодировка «UTF» (Unicode Transformation Format — формат преобразования Юникода) способна закодировать более 32 000 разнообразных букв алфавитов, значков и символов. Использование этой одной кодировки для обмена данными решает все проблемы несовместимости при передаче текстов.
На заметку! Если перед Вами стоит вопрос, в какой кодировке нужно создавать сайт и размещать тексты, то отвечаем — используйте «UTF»! Это наиболее универсальное решение, но не стоит забывать, что для хранения текстов в кодировке «UTF» требуется в два раза больше места. Если Ваш сайт нацелен только на аудиторию России, то, возможно, всё-таки стоит использовать более известную в нашей стране кодировку — «cp1251». Выбор оставляем за Вами.
Конечно, нам легко советовать: используйте «UTF»! Но до появления Юникода слишком много информации на сайтах было размещено с использованием других кодировок. В настоящее время часто встаёт вопрос перекодировки текста из уже устаревающих кодировок в «UTF». В частных случаях, может потребоваться перекодирование текста в других направлениях. Но об этом, ниже.
Способы перекодировки текста
Под перекодировкой текста стоит понимать процесс конвертирования текстовых файлов, скриптов и других текстовых данных из одной кодировки в другую. Наиболее часто приходиться конвертировать тексты между следующими кодировками: win1251, koi8 и UTF. Если у Вас проблемы с другой кодировкой, то подход к решению проблемы сохраняется. Перейдём от теории к практике.
Программа «Shtirlitz»
С помощью программы «Shtirlitz» («Штирлиц») легко можно расшифровать, раскодировать русский текст или перекодировать из одной кодировки в другую. Программа разработана под ОС «Windows» и работает с большинством известных кодировок.
Если бы ни ограничения, с которыми нам однажды пришлось столкнуться, то на этом можно было бы закончить давать Вам советы по раскодировке текстов. Программы «Штирлиц» было бы достаточно для решения всех проблем.
Однажды, нашим специалистам в процессе переноса сайта на хостинг потребовалось перекодировать файл дампа базы данных «MySql» из кодировки «UTF» в «win1251». Всё бы хорошо, но дамп базы был очень большого размера (более 100 Мб). Использовать программу «Штирлиц» для смены кодировки файла не получилось, поскольку она просто зависала при работе с таким объёмом текста. Преобразовать кодировку файла удалось, написав специальный скрипт на языке PHP. Остановимся на нём поподробнее.
Скрипт на PHP для смены кодировки текста
Приведём несколько модификаций php-скриптов для изменения кодировки файлов. Каждый из скриптов, решает свою несложную задачу. Вы можете дорабатывать их и использовать по своему усмотрению. Только обязательно делайте резервную копию важных данных перед порчей ;).
Задача 1. Смена кодировки файла
Пример кода PHP для изменения кодировки файла с «UTF» на «win1251»:
<?
/**************
* convert1.php
**************/
$file="./tmp.txt";//путь к файлу, который необходимо перекодировать
$text=file_get_contents($file);//читаем данные из файла
#конвертируем текст из «cp1251» в «utf-8» с помощью функции iconv()
$text=iconv("cp1251", "utf-8", $text);
file_put_contents($file, $text);//пишем данные обратно в файл
?>
Изменить кодировку одного файла Вы вполне могли бы и с помощью упомянутой ранее программы «Shtirlitz». Более интересное решение, изменение кодировок группы файлов, например, в каталоге.
Задача 2. Смена кодировки всех файлов в каталоге
Пример кода PHP для изменения кодировки с «UTF» на «win1251» у всех файлов в заданном каталоге:
<?
/**************
* convert2.php
**************/
$path="./tmp"; //путь к каталогу, в котором лежат файлы для перекодировки
$handle=opendir($path);
while ($file = readdir($handle)){
if (is_file($path."/".$file)){
#находим по порядку все файлы и перекодируем
$text=file_get_contents($path."/".$file);//читаем данные из файла
#конвертируем текст из «utf-8» в «cp1251» с помощью функции iconv()
$text=iconv("utf-8", "cp1251", $text);
file_put_contents($path."/".$file, $text);//пишем данные обратно в файл
}
}
?>
Приведённые скрипты php наглядно демонстрируют использование функции iconv() для работы с кодировками. Но нашу проблему перекодировки больших по размеру файлов ни первый, ни второй скрипт не решают. Например, если размер исходного файла перед обработкой был 1 000 000 байт, то в процессе отладки мы наблюдали следующее:
…
//в переменной $text содержится текстовая информация из 1 000 000 символов
echo strlen($text)." байт";//1000000 байт
$text=iconv("cp1251", "utf-8", $text);
echo strlen($text)." байт";//8763 байт
…
Т.е. видно, что после применения функции iconv над длинной строкой мы получали урезанную до 8763 символов строку. При этом урезанная строка имела правильную нужную нам кодировку. К сожалению, мы не смогли понять странное поведение функции iconv() при работе с длинной строкой текста.
Проблему удалось решить следующим способом. Мы стали разбивать большой текст на части и передавать их на обработку в функцию iconv.
Возможно, Вы столкнулись с подобной проблемой при работе с большими файлами и наш скрипт пригодится.
Задача 3. Смена кодировки большого файла
Пример кода PHP для изменения кодировки с «UTF» на «win1251» у большого файла:
<?
/**************
* convert3.php
**************/
$file="./tmp.txt";//путь к файлу, который необходимо перекодировать
$arr=file($file);//читаем данные из файла в массив построчно
$cnt=count($arr);//число прочитанных строк из файла
$text=””;
for($i=0; $i<$cnt; $i++){
#конвертируем короткие строки из «utf-8» в «cp1251» с помощью функции iconv()
$text.=iconv("utf-8", "cp1251", $arr[$i]);
}
file_put_contents($file, $text);//пишем данные обратно в файл
?>
Вот таким вот способом нам удалось перекодировать файл большого размера из одной кодировки в другую.
На заметку! Если Вам потребуется помощь в поддержке сайтов, обращайтесь. Постараемся помочь за разумные деньги.
Желаем Вам находить выход из любой сложной ситуации!
Автор: «Ваш МАСТЕР»Читайте в этом же разделе:
- Промо-сайт. Особенности разработки сайта
- Сайт-визитка. Особенности разработки сайта
- Интернет-магазин. Особенности разработки сайта
- Как написать YML для Яндекс.Маркет
Комментарии
Если Вы можете качественно дополнить нашу статью, задать интересный вопрос или готовы исправить ошибку, то мы будем только рады. Заранее Вам благодарны!
Оставить свой комментарий к статье
| 19.09.2009 10:29 | Алексей Полезные скрипты, спасибо. Функция iconv() для перекодировки текста действительно очень сильна. |
| 06.12.2010 16:24 | iiuri kondrashev Здравствуйте! У меня возник вопрос: возможно ли на одной странице использовать две кодировки? Причем кодировка utf-8 использована |
| 06.12.2010 19:38 | Ваш МАСТЕР Юрий, насколько нам известно, кодировка задаётся одна и для всей страницы. Использовать для отдельных элементов свою кодировку прямым способом не получится. Можно, конечно, пойти другим путём, например, использовать JavaScript или AJAX для отправки данных на сервер и их перекодировки в нужную кодировку. Или, как вариант, можно на страницу подгрузить другую с помощью тега iframe, для которого будет прописана своя кодировка. |
| 31.01.2011 23:53 | Filsh PHP сам по себе очень слабый в вопросе перекодировки, нет никакого уверенного способа определить кодировку текста, вы попробуйте перекодировать Windows-1251 в UTF-8, таким кодом |
| 16.02.2011 07:31 | Александр Скрипт по замене групп файлов не работает! Файлы после перекодирования становятся пустыми! |
| 16.02.2011 09:34 | Ваш МАСТЕР Александр, вполне вероятно. |
| 11.08.2011 10:14 | evgeniy 31.01.2011 23:53 | Filsh |
| 12.08.2011 13:08 | Евгений Windows-1251 было создана для пиратских копий windows, а UTF- это международный стандарт. |
| 10.09.2011 09:05 | Сергей Большое спасибо! Сейчас воспользуюсь. Правильно ли я понял, что с помощью этого скрипта я смогу перейти от кодировки ANSI к UTF-8? |
| 02.02.2012 19:19 | Виталий Есть сервисы которые могут проверить правильная ли кодировка? |
| 16.03.2012 22:33 | Андрей С порядком аргументов в функции iconv в примерах путаница, поправить бы. |
При любом использовании информации веб-сайта
гиперссылка на «Ваш МАСТЕР» обязательна!

