«Ваш МАСТЕР»
На главнуюОставить заявкуКарта сайта
Разработка, поддержка, раскрутка сайтов
Звоните:
(916) 728-60-20
Не смогли дозвониться?


Делаем правильные сайты

Сайт-визитка — от 40 000 р. Хочу бесплатно!
Интернет-магазин — от 60 000 р.

Смотреть примеры | Заказать или оценить сайт!

О создании сайтов

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);//пишем данные обратно в файл
?>

Вот таким вот способом нам удалось перекодировать файл большого размера из одной кодировки в другую.

На заметку! Если Вам потребуется помощь в поддержке сайтов, обращайтесь. Постараемся помочь за разумные деньги.

Желаем Вам находить выход из любой сложной ситуации!

Автор: «Ваш МАСТЕР»



← Защита от спама. Борьба со спамом на сайте

Сброс пароля у пользователя root к базе MySql →

Читайте в этом же разделе:

К списку


Комментарии

Если Вы можете качественно дополнить нашу статью, задать интересный вопрос или готовы исправить ошибку, то мы будем только рады. Заранее Вам благодарны!

Оставить свой комментарий к статье

19.09.2009 10:29 | Алексей

Полезные скрипты, спасибо. Функция iconv() для перекодировки текста действительно очень сильна.

Хочется обратить внимание на такие функции перекодирования строк, как mb_convert_encoding() и convert_cyr_string().

Например, функция convert_cyr_string отлично работает с кириллицей.

Часто, при конвертации текста из одной кодировки в другую одна функция может дать непредсказуемый результат. Тогда поможет другая.

Пользуйтесь на здоровье. Благо разработчики PHP предоставили нам достаточно возможностей для работы с кодировкой текстов.

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, таким кодом
iconv('UTF-8', 'Windows-1251', $str)

и вы получите ошибку, зачем так сделано известно только разработчикам

16.02.2011 07:31 | Александр

Скрипт по замене групп файлов не работает! Файлы после перекодирования становятся пустыми!

16.02.2011 09:34 | Ваш МАСТЕР

Александр, вполне вероятно.
Возможно, вы проверяете его работу на машине с другими настройками. Может не хватать какого-нибудь модуля для работы с кодировкой и т.п. Без отладки это не узнать.
Если разбираетесь в PHP, то легко сможете найти место, в котором происходит сбой в вашем случае и подкорректировать скрипт под ваши требования и настройки сервера.
Мы проверяли скрипт на машине с UNIX и PHP4, всё отлично работало и работает.
Факт возможных несовместимостей версий и настроек ещё раз доказывает, что при работе со своими скриптами и тем более со сторонними всегда следует делать резервные копии рабочего материала.

11.08.2011 10:14 | evgeniy

31.01.2011 23:53 | Filsh
Определить кодировку можно mb_detect_encoding.
Во вторых windows-1251, это фактически не кодировка, а синоним кодировки CP-1251. Поэтому писать надо CP-1251 а не Windows-1251. Так как, она может быть и Win1251, или Win-1251. Это все синонимы.

12.08.2011 13:08 | Евгений

Windows-1251 было создана для пиратских копий windows, а UTF- это международный стандарт.
По-моему выбор очевиден.
Вот ещё полезная информация о кодировках Windows-1251 и UTF-8
http://www.wellsait.ru/kodirovka.php

10.09.2011 09:05 | Сергей

Большое спасибо! Сейчас воспользуюсь. Правильно ли я понял, что с помощью этого скрипта я смогу перейти от кодировки ANSI к UTF-8?

02.02.2012 19:19 | Виталий

Есть сервисы которые могут проверить правильная ли кодировка?

Есть сайт самоделкин-сайтов.рф Хочу узнать все ли у него впорядке с кодировкой...

16.03.2012 22:33 | Андрей

С порядком аргументов в функции iconv в примерах путаница, поправить бы.
>


При любом использовании информации веб-сайта
гиперссылка на «Ваш МАСТЕР» обязательна!

О создании сайтов

Проверка сайта в разных браузерах

Как восстановить пароль к админке сайта

Закладки обманчивы

Магазины, дружащие с Яндекс.Маркет

ТОП 10 самых раздражающих факторов для программиста

Какого буя PHP 5.3 не имеет обратной совместимости?

О продвижении сайтов

Домены ru ,com, biz, info - есть ли разница для продвижения?

Защита от нечестных приемов в контекстной рекламе

Фильтр Аффилиат. Как избавиться?

Яндекс.Маркет начинает размещать офлайн-магазины

О программах

Вышел легковесный веб-браузер Rekonq 0.7

Как узнать IP-адрес сайта?

Найти все сайты на одном IP

Возможности интеграции с Mail.Ru

События

Специалисты по взлому создали вредоносный гаджет

Хакеры взломали сайт ЦРУ США

У сервиса Skype произошли новые сбои в работе

Сервис WebVisor.ru прекращает работу


Свежие комментарии

Редирект. Примеры переадресации сайтов
спасибо!!!

Поиск и замена текста. Методы решения
Как менять строку в дампах понятно. Но ПОЧЕМУ БЫЛО НЕ НАПИСАТЬ ТУТ запрос, которым это можно сделать без дампов? Извините, если база многомегабайтная, то дампить/аплоудить гораздо сложнее, чем

Сброс пароля у пользователя root к базе MySql
Какие-то способы у вас ненадежные. Выше версии 4.1 MySQL в таблице data\mysql\user.MYD сразу после localhost.root прибить "*" (поставить 00 вместо нее в любом хексаедите) = нет пароля. И так с

Вирус на сайте? Как его найти и удалить
Я знаю, на какой странице сайта вордпресс есть вредоносный код, как мне эту страницу найти через фтп клиент, чтобы отредактировать? Подскажите пожалуйста...

Услуги команды
«Ваш МАСТЕР»
Rambler's Top100