Преобразовать windows 1251 utf php

Содержание
  1. Заметки Лёвика
  2. web программирование, администрирование и всякая всячина, которая может оказаться полезной
  3. PHP iconv — кодировка из utf-8 windows-1251
  4. Если не работает iconv
  5. iconv array для массива
  6. Комментарии (3) к записи “PHP iconv — кодировка из utf-8 windows-1251”
  7. Конвертация кодировок utf-8 и win-1251 в PHP через iconv
  8. Конвертация кодировок utf-8 и win-1251 в PHP через iconv
  9. Конвертация сайта из Windows-1251 в UTF-8
  10. Преимущества кодировки UTF-8
  11. Перекодирование сайта в UTF-8
  12. Редактирование скриптов в кодировке UTF-8
  13. Конвертация данных в MySQL
  14. В БД ‘ . $dbname . ‘ установлена кодировка по умолчанию: ‘ . $mysql_charset_db . ‘
  15. В БД ‘ . $dbname . ‘ установлена кодировка по умолчанию: ‘ . $mysql_charset_db . ‘
  16. Найдено таблиц ‘ . $counter_tables . ‘ шт., кодировка соединения соответствует табличным кодировкам по умолчанию
  17. Таблицы не соответствующие кодировке соединения
  18. Кодировка соединения с БД: ‘ . $mysql_charset_conn . ‘
  19. Перекодировка скриптов из Windows-1251 в UTF-8

Заметки Лёвика

web программирование, администрирование и всякая всячина, которая может оказаться полезной

PHP iconv — кодировка из utf-8 windows-1251

При помощи функции php iconv (строго говоря, это не совсем функция PHP, она использует стороннюю библиотеку (есть iconv.dll и php_iconv.dll или iconv.so), которой может не быть на хостинге) легко преобразовать кодировку (например, из windows-1251 в utf-8 и наоборот:

$s = iconv( «cp1251″,»UTF-8», $s);
$s = iconv(«UTF-8», «windows-1251», $s);

Однако, если не работает iconv на хостинге, а преобразовать текст из одной кодировки в другую необходимо, можно воспользоваться сторонними функциями (на самом деле, встречал несколько вариантов — какой из них лучше.. или точнее “более рабочий” — не скажу).

Про преобразование UFT-8 сущностей я уже писал ранее , однако иногда требуется наоборот перевести текст из cp1251 в utf-8 — например.

Если не работает iconv

function iconv ($in_charset, $out_charset, $str) string — для преобразования из Windows в UTF-8 выполняем один из вызовов
iconv( «cp1251″,»UTF-8», $s);
iconv( «windows-1251″,»UTF-8», $s);
выдаёт пустую строку (если в $s нет английских символов — они в любой кодировке отображаются одинаково) на некоторых хостингах можно попробовать использовать функцию mb_convert_encoding — у неё другой порядок аргументов!
function mb_convert_encoding ($str, $to_encoding, $from_encoding = null) string

Т.е. чтобы преобразовать текст из кодировки windows-1251 в UTF-8 следует выполнить:
mb_convert_encoding($s,»UTF-8″,»windows-1251″);

iconv array для массива

В некоторых ситуациях преобразовать одномерный или многомерный массив из одной кодировки в другую (например, из utf8 в windows-1251) с сохранением ключей массива. Для решения, можно использовать несколько способов.
// если не требуется сохранять предыдущий массив, для экономии
// передаем его по ссылке, происходит замена внутри
function utf8to1251(&$text) <
$text = iconv(«utf-8», «windows-1251», $text); //without return
>
array_walk_recursive($array, «utf8to1251»);

Или, если требуется оставить исходный массив без изменений — можно воспользоваться:
$newArray = array_map(create_function(‘$v’, ‘return iconv(«utf-8», «windows-1251», $v);’), $oldArray);

Метки: iconv

Опубликовано Пятница, Октябрь 21, 2011 в 15:02 в следующих категориях: Без рубрики. Вы можете подписаться на комментарии к этому сообщению через RSS 2.0. Вы можете оставить комментарий. Пинг отключен.

Автор будет признателен, если Вы поделитесь ссылкой на статью, которая Вам помогла:
BB-код (для вставки на форум)

html-код (для вставки в ЖЖ, WP, blogger и на страницы сайта)

ссылка (для отправки по почте)

Комментарии (3) к записи “PHP iconv — кодировка из utf-8 windows-1251”

Как быть с запросом select к базе mssql не понимает кирилицу
“select
[Название]
,[номер]
, [Removed]
from imdb.dbo. Оконечное оборудование “;

Следует привести столбцы (или всю базу данных сразу) к соответствующему сравнению (кодировке)
ALTER DATABASE COLLATE Cyrillic_General_CI_AS

Или использовать Nvarchar

declare @test TABLE
(
Col1 varchar(40),
Col2 varchar(40),
Col3 nvarchar(40),
Col4 nvarchar(40)
)
INSERT INTO @test VALUES
(‘иытание’,N’иытание’,’иытание’,N’иытание’)
SELECT * FROM @test

В старом скрипте на php 5.3 работает
function conv($text) <
return iconv(’UTF-8′, ‘WINDOWS-1251′, $text);
>

Если изменяю версию php 5.6 то не перекодируется. Не подскажете?

Конвертация кодировок utf-8 и win-1251 в PHP через iconv

Обычно php страница или сайт имеет одну базовую кодировку. Я работаю только с UTF-8, но бывают случаи, когда приходится использовать какой-нибудь php файл с кодировкой win-1251, а передаваемые в него значения идут в кодировке UTF-8. В этом случае после исполнения скрипта появляются кракозябры.

Таких ситуаций может быть множество, например, при использовании функции отправки сообщений mail(), работе с PDF обработкой или даже при различных действиях с БД. В идеале нужно обязательно избавляться от таких хвостов и не допускать в коде функции конвертации, но если это просто невозможно, то на помощь вам придет функция iconv.

Синтаксис функции: $string= iconv(‘начальная кодировка’, ‘конечная кодировка’, $string);

Здесь $string — строка, кодировку которой мы изменяем

Читайте также:  Ubericon для windows 10

Из этого выходит, что для того, чтобы преобразовать строку из кодировки utf-8 в win-1251 нужно писать следующее: $string= iconv(‘utf-8’, ‘win-1251’, $string);

Из win-1251 в utf-8: $string= iconv(‘win-1251’, ‘utf-8’, $string);

На заметку, помните, что кодировку в php странице можно указывать за счет установки header-а документа. Например, если ваша страница в UTF-8 без BOM, то в самом начале документа ставьте: . Если же windows 1251, то сам документ должен быть в ANSI, а в первой строке можете поставить: . Иногда эти манипуляции помогают с письмами, которые приходят в кракозябрах из-за неверной кодировки.

Конвертация кодировок utf-8 и win-1251 в PHP через iconv

Обычно php страница или сайт имеет одну базовую кодировку. Я работаю только с UTF-8, но бывают случаи, когда приходится использовать какой-нибудь php файл с кодировкой win-1251, а передаваемые в него значения идут в кодировке UTF-8. В этом случае после исполнения скрипта появляются кракозябры.

Таких ситуаций может быть множество, например, при использовании функции отправки сообщений mail(), работе с PDF обработкой или даже при различных действиях с БД. В идеале нужно обязательно избавляться от таких хвостов и не допускать в коде функции конвертации, но если это просто невозможно, то на помощь вам придет функция iconv.

Синтаксис функции: $string= iconv(‘начальная кодировка’, ‘конечная кодировка’, $string);

Здесь $string — строка, кодировку которой мы изменяем

Из этого выходит, что для того, чтобы преобразовать строку из кодировки utf-8 в win-1251 нужно писать следующее: $string= iconv(‘utf-8’, ‘win-1251’, $string);

Из win-1251 в utf-8: $string= iconv(‘win-1251’, ‘utf-8’, $string);

На заметку, помните, что кодировку в php странице можно указывать за счет установки header-а документа. Например, если ваша страница в UTF-8 без BOM, то в самом начале документа ставьте: . Если же windows 1251, то сам документ должен быть в ANSI, а в первой строке можете поставить: . Иногда эти манипуляции помогают с письмами, которые приходят в кракозябрах из-за неверной кодировки.

Конвертация сайта из Windows-1251 в UTF-8

Преимущества кодировки UTF-8

Забегая на перед можно с уверенностью сказать, что на сегодняшний день следует использовать исключительно кодировку UTF-8. Это, конечно, не означает, что нужно конвертировать из win-1251 в UTF-8 все, особенно не поддерживаемые более сайты, но задуматься о переводе активно развиваемых проектов нужно было еще, как говорят, вчера. Потребность в конвертации сайта из win-1251 в UTF-8 возникает по многим причинам, но для начала следует разобраться, в чем же принципиальная разница этих кодировок? Самое главное отличие — количество символов, которые могут содержаться в каждой из них.

Кодировка Windows-1251 может содержать не более 255 символов, так как все символы этой кодировки кодируются одним байтом. Из-за этой особенности, такие кодировки, как win-1251 еще называют «однобайтными». В состав Windows-1251 входят символы кириллического, латинского алфавитов, знаки препинания и некоторые другие символы. Из-за столь ограниченного набора символов, вывести в Windows 1251 символы китайского иероглифа (供) или, например, немецкого умляута (ö) невозможно.

Можно предположить, как делают множество создателей кириллических сайтов, что для проектов, на которых будут использоваться только кириллица или латинские символы кодировка utf-8 ни к чему. Еще больше, в приоритете использования Windows-1251 может убедить тот факт, что символы этой кодировки занимают меньше места, и в следствие чего немного быстрее обрабатываются строковыми функциями PHP.

Кодировка UTF-8 имеет настолько больше преимуществ, что увеличенный размер её символов перестает играть значимую роль и превращается в одни плюсы. В utf-8 хранится огромный набор знаков, иероглифов и букв различных алфавитов, включая и кириллические, в связи с чем русскоязычный сайт в кодировке utf-8 корректно отобразиться на компьютерах в Японии, арабских и других стран, которые даже не подозревают о существовании кодировки win-1251 и других однобайтных кодировок (KOI8-R, CP866, ISO 8859-5 и др.) с поддержкой кириллических символов.

Подробнее про кодировку UTF-8 можно узнать из материалов Википедии .

Перекодирование сайта в UTF-8

Перекодирование скриптов сайта из win-1251 в UTF-8 — это далеко не простое занятие, как может показаться на первый взгляд. Необходимо проделать большой объем работы, вкратце рассмотренный ниже:

  1. Конвертировать данные MySQL.
  2. Конвертировать файлы скриптов и некоторые другие.
  3. Заменить строковые функции на их мультибайтные аналоги.
  4. Изменить паттерны во многих функциях регулярных выражений.
  5. Заменить функции отправки почты.
  6. Исправить все внутренние перекодировки iconv() и др.
  7. Протестировать.

Большинство сложностей с конвертацией сайта из win-1251 (или любой другой однобайтовой кодировки) в UTF-8, в первую очередь вызваны тем, что PHP, даже самая новая версия (на момент написания статьи 5.4), не полностью поддерживает кодировку UTF-8. Поскольку большинство символов в UTF-8 закодированы двумя (до четырех) байт — обычные строковые функции не правильно работают с такими символами. Пример ниже следует набирать в UTF-8:

Читайте также:  Network file manager windows

Вместо ожидаемого вывода «Проверк» получаем «Про» и «крокозябл» в конце — «�». Обычные строковые функции PHP предназначены для работы с однобайтными кодировками, символы которых состоят из одного байта, вот функция substr() и вырезает первые семь байт соответствующие симовлам «П,р,о» (кириллические буквы в UTF-8 кодируются 2-мя байтами) и первому байту буквы «в», вследствие чего «в» и превращается в «крокозябл �».

Далее будут рассмотрены способы, как подружить строковые функции PHP с кодировкой UTF-8.

Редактирование скриптов в кодировке UTF-8

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

В качестве редактора PHP-кода можно посоветовать бесплатный NetBeans или платные редакторы PhpStorm (99$), Zend Studio (299$). Поскольку это не обычные редакторы, а так называемые IDE (интегрированная среда разработки) — дополнительный функционал этих программ будет весьма кстати при рефакторинге кода для UTF-8.

Конвертация данных в MySQL

Перед конвертацией данных в базе MySQL из Windows-1251 в UTF-8 необходимо обязательно выполнить резервное копирование конвертируемой БД, в противном случае можно безвозвратно потерять все или часть данных! Следует обратить внимание, что в MySQL кодировка Windows-1251 называется cp1251, а UTF-8 — utf8.

Первым шагом необходимо обязательно проверить — соответствует ли кодировка БД, таблиц и всех её колонок соединению по умолчанию, во избежание необратимого перекодирования неизвестных новой кодировке символов в вопросительные знаки. Точнее, следует проверить, правильно ли «общался» скрипт с БД и нет ли во всех таблицах самой БД колонок с разными кодировками. Соединение с MySQL по умолчанию для всех запросов должно быть установлено в cp1251 — этот параметр задается либо в настройках MySQL в главном конфигурационном файле (MySQL — установка и настройка default-character-set=cp1251), либо в скриптах сайта сразу после подключения к БД: mysql_query ( ‘SET NAMES cp1251’ ) . Для самой БД, таблиц и её колонок кодировка также, должна быть cp1251. Выполнить проверку поможет скрипт, код которого опубликован ниже (если таблиц не много можно посмотреть данные о кодировках при помощи PHPMyAdmin):

$mysqlhost = » ;
$mysqlusers = » ;
$mysqlpass = » ;
$dbname = » ;

$db = @ mysql_connect ( $mysqlhost , $mysqlusers , $mysqlpass ) ;
mysql_select_db ( $dbname ) ;
//mysql_query(‘SET NAMES cp1251’);

// Скрипт проверки кодировок
// http://petrenco.com/php.php?txt=142

// Кодировка соединения
$result = mysql_query ( ‘show variables like «character_set_connection»;’ ) ;
$row = mysql_fetch_assoc ( $result ) ;
$mysql_charset_conn = $row [ ‘Value’ ] ;

// Кодировка БД
$result = mysql_query ( ‘SHOW VARIABLES LIKE «character_set_database»;’ ) ;
$row = mysql_fetch_assoc ( $result ) ;
$mysql_charset_db = $row [ ‘Value’ ] ;

$result = mysql_query ( ‘SHOW TABLES’ ) ;
while ( $row = mysql_fetch_row ( $result ) )
$tables_arr [ ] = $row [ 0 ] ;

$counter_tables = 0 ;
foreach ( $tables_arr AS $table_name )
<
$result = mysql_query ( ‘SHOW CREATE TABLE `’ . $table_name . ‘`’ ) ;
while ( $row = mysql_fetch_assoc ( $result ) )
<
preg_match_all ( ‘

i’ , $row [ ‘Create Table’ ] , $matches ) ;
preg_match ( ‘

i’ , $row [ ‘Create Table’ ] , $match ) ;
if ( is_array ( $matches [ 1 ] ) )
<
foreach ( $matches [ 0 ] as $key => $found_cols )
<
$res_arr [ $table_name ] [ ‘columns’ ] [ $matches [ 1 ] [ $key ] ] [ ‘type’ ] = $matches [ 2 ] [ $key ] ;
$res_arr [ $table_name ] [ ‘columns’ ] [ $matches [ 1 ] [ $key ] ] [ ‘charset’ ] = $matches [ 3 ] [ $key ] ;
>
>
if ( $match [ 1 ] !== $mysql_charset_conn )
<
$res_arr [ $table_name ] [ ‘default_charset’ ] = $match [ 1 ] ;
>
$counter_tables ++;
>
>
//print_r($res_arr);

$table_txt = » ;
foreach ( $res_arr AS $table => $vals_arr )
<
if ( is_array ( $vals_arr [ ‘columns’ ] ) )
<
foreach ( $vals_arr [ ‘columns’ ] AS $column => $column_val )
<
$columns .= ‘

‘ ;
>
>
else
<
$columns = ‘ Кодировка столбцов равна кодировке таблицы ‘ ;
>

if ( ! empty ( $vals_arr [ ‘default_charset’ ] ) )
$default_charset_txt = ‘ ‘ . $vals_arr [ ‘default_charset’ ] . ‘ ‘ ;
else
$default_charset_txt = ‘ ‘ . $mysql_charset_conn . ‘ ‘ ;
$table_txt .= ‘

‘ . $table . ‘

‘ . $default_charset_txt . ‘

‘ . $columns . ‘

‘ ;
>

if ( $mysql_charset_db !== $mysql_charset_conn )
$db_charset = ‘

В БД ‘ . $dbname . ‘ установлена кодировка по умолчанию: ‘ . $mysql_charset_db . ‘

В БД ‘ . $dbname . ‘ установлена кодировка по умолчанию: ‘ . $mysql_charset_db . ‘

if ( empty ( $table_txt ) )
$table_found = ‘

Найдено таблиц ‘ . $counter_tables . ‘ шт., кодировка соединения соответствует табличным кодировкам по умолчанию

Таблицы не соответствующие кодировке соединения

(DEFAULT CHARSET)

Кодировка колонок

‘ . $table_txt . ‘

‘ ;
>

Кодировка соединения с БД: ‘ . $mysql_charset_conn . ‘

Скрипт находит все несоответствующие соединению кодировки в БД. О наличии таких кодировок можно узнать из сообщений красного цвета. Как подготовить такие данные к конвертации можно прочитать тут: » Проблемы с кодировкой в MySQL версий 4.1+ «, » Исправление и преобразование кодировок таблиц MySQL «. Если на странице только черный, зеленый и оранжевый (кодировка соединения) цвета — с кодировками в БД все впорядке и можно приступать к конвертированию данных: «Конвертация БД из Win-1251 в UTF8».

Читайте также:  Navitel windows ce автонавигатор

После преобразования данных в таблицах MySQL из cp1251 в utf8 необходимо изменить кодировку по умолчанию для скриптов (изменение настройки в my.ini / my.conf или SQL запросом SET NAMES utf8 каждый раз после подключения к БД). Также следует заменить заголовок с указанием кодировки, отправляемый сервером браузеру клиента. Это можно сделать изменив в HTML-коде строку, расположенную между дескрипторами .

или выведя заголовок непосредственно средствами PHP:

Эти два способа указания кодировки браузеру можно совместить.

Теперь, вся информация из БД будет выводиться на страницах сайта как положено, а вот все тексты не латинскими буквами, расположенные в скриптах, отобразятся «кракозяблами». Для превращения «кракозяблов» в нормальный текст необходимо перекодировать уже сами скрипты, о чем речь пойдет в следующем разделе.

Перекодировка скриптов из Windows-1251 в UTF-8

Поскольку латинские буквы и знаки препинания имеют одинаковые коды символов как в кодировке Windows-1251 и так и в UTF-8 — проблем с их отображением не возникнет. В связи с этим ни код PHP, ни HTML-разметка, заданная латинскими буквами и знаками препинания практически не пострадают. Другое дело — кириллический алфавит.

Чтобы кириллические символы отображались как положено в кодировке UTF-8 необходимо их перекодировать. Один из простейших способов организовать этот процесс — использование мощностей библиотеки ICONV (PHP-функция iconv ( ) ). Конвертировать все подряд не нужно — необходимо исключить бинарные файлы (файлы изображений, pdf, архивов и др.) — если случайно конвертировать и их — данные этих файлов будут потеряны.

Скрипт, представленный ниже, помогает автоматизировать процесс конвертирования скриптов в UTF-8 из Windows 1251. Функция win1251_to_utf8() обрабатывает все вложенные директории и файлы, позволяя задать исключения — файлы и директории, данные в которых конвертировать в UTF-8 не нужно. Также необходимо задать расширения файлов — только файлы с заданными расширениями будут конвертированы. Перед запуском скрипта — обязательно сделайте резервную копию конвертируемых файлов! Ведь, например, если случайно запустить этот скрипт повторно, и конвертировать файлы, которые уже находятся в кодировке UTF-8 из Win1251 снова в UTF-8 — возможны проблемы с данными.

Перед запуском функции win1251_to_utf8(), следует ОБЯЗАТЕЛЬНО убедиться, что все файлы, подлежащие конвертации доступны на запись, в противном случае может получиться «каша» из файлов с кодировкой Windows-1251 и UTF-8, разобраться в которой будет уже совсем не легко. Для этих целей следует изначально задать переменной $convert значение 0. Если ошибок не найдено, то тогда нужно присвоить $convert значение 1.

ini_set ( ‘display_errors’ , 1 ) ;

// Конвертер модуля ссылок

// Входные данные
// $source . — путь к директории, например my_script_w1251/scripts (в конце слеш не нужен)
// $ext_convert . — массив с разрешенными расширениями файлов — только файлы с указанными разрешениями будут конвертироваться. Например: array(‘php’, ‘inc’);
// $exclude . — массив с файлами и директориями, данные которых конвертировать запрещено. Например: array(‘dir’ => 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 ( ) )
<
// http://petrenco.com/php.php?txt=142
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 = ‘

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’ ] .= ‘

$source = ‘my_project/lib’ ; // Начинать с той же директории, из которой запущен файл с функцией
$convert = 0 ;
$ext_convert = array ( ‘php’ , ‘inc’ , ‘html’ , ‘htm’ ) ;
$exclude_dir = array ( $source . ‘/img’ , $source . ‘/scripts’ ) ; // Директории, файлы в которых конвертировать не нужно
$exclude_file = array ( $source . ‘/!capcha.php’ ) ; // файлы, которые конвертировать не нужно
$exclude = array ( ‘file’ => $exclude_file , ‘dir’ => $exclude_dir ) ;

$result_func = win1251_to_utf8 ( $source , $ext_convert , $exclude , $convert ) ;

Оцените статью