home

IT Runs

text

Необходимый фокус с кодировками

Итак, все настроено для работы с UTF-8:

  • в заголовке страницы есть <meta http-equiv=”Content-Typecontent=”text/html; charset=UTF-8“>
  • в базе данных указана кодировка по умолчанию utf-8
  • apache настроен отдавать страницы в utf-8

Остается только одно: когда данные формы передаются в php и затем помещаются в базу данных, через phpmyadmin они выглядят как не понятно что. И все вроде бы хорошо, потому что если через тот же php вывести данные из БД, то они отображаются нормально. Но эта фигня в phpmyadmin режет глаза.

Решается оно вот как. После подключения к базе данных, вписываем следующие строчки:

mysql_query (“set character_set_client=’utf8’”);
mysql_query (“set character_set_results=’utf8’”);
mysql_query (“set collation_connection=’utf8_general_ci’”);

Ну или какая там кодировка, соответственно. Эти строчки настраивают соответствие кодировок клиента и сервера MySQL, и приводят этот бардак в порядок.

2 years ago

April 3, 2010
text

И еще последствия перехода на UTF-8

И конечно же, с мультибайтовыми строками обламываются стандартные функции для работы со строками. Облом заключается в том, что один символ они начинают считать за два. Исправляется, опять же, использованием расширения mb_string:

http://ru2.php.net/manual/en/ref.mbstring.php

Лично я просто заменил функции:

strlen = mb_strlen

substr =mb_substr

и все чудесным образом исцелилось.

2 years ago

March 3, 2010
text

Еще одно решение проблемы mail в php

Поступило еще одно решение проблемы с темой (subject) письма, отправляемого функцией mail в php (подробности здесь: http://itruns.ru/post/422397378/sendmail). За решение спасибо ereptoris:

$subject = '=?UTF-8?'; //Говорим, что у нас в теме текст в соответствующей кодировке

$subject .= 'B?'; //А текст зашифрован алгоритмом base64

$subject .= base64_encode($content) . '?='; // Кодируем текст и дописываем завершающее выражение

Нечто похожее описано на той же странице на php.net. Может быть кому-то так и удобнее, не спорю. Лично для меня, более простой и очевидный способ я описал в предыдущей заметке, тем более, mb_string в любом случае подключен и никакой его глючности я пока что не заметил.

2 years ago

March 3, 2010
text

Новые потрясающие выкрутасы с sendmail

В темпе вальса переводим все письма в UTF-8! И, само собой, ничто никогда не работает сразу так, как хочется =).

Если в header просто заменить кодировку на UTF-8:

Content-type: text/html; charset=utf-8

само тело письма преобразуется нормально. Однако тема (subject) продолжает подражать самым изысканным иероглифам. На сайте php.net нашлась вот такая строчка:

$subject= mb_encode_mimeheader($subject, “UTF-8”, “B”, “\n”);

Сработало. Почему-то, не с первого раза, но это я уже не в силах объяснить.

2 years ago

March 2, 2010
text

Кусочек кода

Сегодня уже в который раз столкнулся с такой проблемой: есть сайт, с которого нужно нагло содрать какую-то информацию. На этом сайте html-сущности закодированы не очень понятно чем и выглядят на подобии &#x26; (представление амперсанда). Вроде интуитивно понятно, что к чему. Вот только обычными функциями php это не возьмешь. Нашелся вот такой кусочек кода:

$str = preg_replace(‘~&#x([0-9a-f]+);~ei’, ‘chr(hexdec(“\1”))’, $str);
$str = preg_replace(‘~&#([0-9]+);~e’, ‘chr(“\1”)’, $str);

Он работает. Лежал на самом видном месте - в примерах к функции html_entity_decode.

Кстати, скорее всего пригодиться при работе со всякими языками вроде китайского.

2 years ago

February 17, 2010