<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Aleksey Parshukov &#187; code</title>
	<atom:link href="http://www.filosof.name/tags/code/feed" rel="self" type="application/rss+xml" />
	<link>http://www.filosof.name</link>
	<description>Aleksey Parshukov persoonal blog</description>
	<lastBuildDate>Sat, 29 Jan 2011 20:59:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Ошибки конвертера для IPB3</title>
		<link>http://www.filosof.name/articles/error-in-converter-to-ipb3.xhtml</link>
		<comments>http://www.filosof.name/articles/error-in-converter-to-ipb3.xhtml#comments</comments>
		<pubDate>Thu, 17 Sep 2009 14:30:06 +0000</pubDate>
		<dc:creator>Aleksey Parshukov</dc:creator>
				<category><![CDATA[Всемирная паутина]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[forum]]></category>
		<category><![CDATA[Invision Power Board]]></category>
		<category><![CDATA[ipb]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[phpbb]]></category>
		<category><![CDATA[unicode]]></category>

		<guid isPermaLink="false">http://www.filosof.name/?p=135</guid>
		<description><![CDATA[Ошибка mySQL query error: INSERT INTO ipb3groups (g_title,g_hide_from_list,g_use_pm,g_max_messages,g_max_mass_pm,prefix,suffix,g_perm_id) VALUES('Русские буквы в названии группы{тут знак вопроса или символ не читаемый в UTF-8}',1,0,0,0,'','',7)&#60;br /&#62; &#60;br /&#62; &#60;br /&#62; &#62;SQL error: Incorrect string value: '\xD0' for column 'g_title' at row 1&#60;br /&#62; &#60;br /&#62; SQL error code: 1366&#60;br /&#62; &#60;br /&#62; Date: Thursday 17th o September 2009 11:48:44 [...]]]></description>
			<content:encoded><![CDATA[<h2>Ошибка</h2>
<p>
<code style="color: red;">mySQL query error: INSERT INTO ipb3groups (g_title,g_hide_from_list,g_use_pm,g_max_messages,g_max_mass_pm,prefix,suffix,g_perm_id) VALUES('Русские буквы в названии группы{тут знак вопроса или символ не читаемый в UTF-8}',1,0,0,0,'','',7)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&gt;SQL error: Incorrect string value: '\xD0' for column 'g_title' at row 1&lt;br /&gt;
&lt;br /&gt;
SQL error code: 1366&lt;br /&gt;
&lt;br /&gt;
Date: Thursday 17th o September 2009 11:48:44 AM&lt;br /&gt;
</code></p>
<h2>Условия возникновения:</h2>
<p>Мигрировал с phpBB3 на IPB 3 (ver 3.0.3)<br />
Использовалась последняя версия конвертера с сайта производителя (на 17.09.2009)<br />
При конвертации <strong>Member Groups</strong></p>
<p>В моём случае ошибка вызвана в файле:<br />
<strong>admin/applications_addon/ips/convert/sources/lib_master.php</strong><br />
<code><em>/**<br />
* IPS Converters<br />
* Application Files<br />
* Library functions<br />
* Last Update: $Date: 2009-09-01 10:53:43 +0100 (Tue, 01 Sep 2009) $<br />
* Last Updated By: $Author: mark $<br />
*<br />
* @package IPS Converters<br />
* @author Mark Wade<br />
* @copyright © 2009 Invision Power Services, Inc.<br />
* @link http://external.ipsl.../?p=converthelp<br />
* @version $Revision: 357 $<br />
*/</em>&lt;br /&gt;&lt;br /&gt;..&lt;br /&gt;<br />
<em>// Line: 1656</em><br />
$info['g_title'] = substr($info['g_title'], 0, 32);</code></p>
<p>Виной всему встроенная php функция <strong>substr()</strong>: <a href="http://ru2.php.net/manual/en/function.substr.php">http://ru2.php.net/manual/en/function.substr.php</a><br />
Использовать её на мультибайт строках не безопасно. Например utf8 который используеться по умолчанию в ipb3 и в phpBB версии 3.<br />
Поэтому скорее всего попытка переахть с других форумах где используеться Юникод тоже вызовет ошибку.</p>
<p><strong>К сведенью</strong>: я быстренько пробежался по коду <strong>IPB 3</strong> и обноружил множество мест, где использовался substr(), очень возможно возникновение похожих ошибок и в других местах и при других обстоятелствах.</p>
<h2>Как лечить:</h2>
<p>Способа есть по крайней мереnhb. Два из них связанны с использованием стандартного php модуля <strong>PHP_MBSTRING</strong>.</p>
<ol>
<li>Пожалуй самый правильным в данном случае, при использовании PHP 5-ой будет включение опции <strong>mbstring.func_overload</strong> (<a href="http://ru2.php.net/manual/en/mbstring.overload.php">http://ru2.php.net/manual/en/mbstring.overload.php</a>). Модуль <strong>mbstring</strong> нужно предварительно активировать. Напрмер так:<br />
<strong>php.ini</strong><br />
<code>mbstring.func_overload = 7</code><br />
Можно и с использование функции <strong>ini_set()</strong>, но придется модифицировать файлы IPB. А этот способ тем и хорош, что не меняються оригинальные файлы форума. Но может привести к ошибкам, там где текстовые функции используються для бинарных операций. А потому после конвертации <strong>mbstring.func_overload</strong> настоятельно рекомендую отключить.
</li>
<li> Отредактировать файл <strong>lib_master.php</strong> заменив <strong>substr()</strong> на <strong>mb_substr()</strong>. Модуль <strong>mbstring</strong> нужно предварительно активировать.</li>
<li> Использховать встроенную в IPB функцию <strong>IPSText::mbsubstr()</strong>.<br />
Этим способом и должны были воспользоваться разработчики IPB. Но почему то этого не сделали.. )</li>
</ol>
<p>Также замечу, что использование последних двух вариантов не спасёт вас от подобной ошибки в других местах.</p>
<h2>Немного философии</h2>
<p>Включением опции <strong>mbstring.func_overload</strong> способно вылечить множество проблем и спользованием Юникода, в качестве кодировки в движке, слабо приспособленного для его использование. Фактически строковые функции PHP Это единственное узкое место с точки зрения Юникода.<br />
<strong>Пример</strong>: phpbb2 не поддерживает Юникод. Но чтобы заставить его корректно работать достаточно включить опцию <strong>mbstring.func_overload</strong> (не забыв предварительно перекодировать базу, lang файлы, изменить кодировку в настройках, стилях и параметрах подключения к базе).</p>
<p>Почему так получаться? Потому что php на уровне ядра не подозревает о существовании Юникода. В отличии скажем от Perl (который давно перешёл на Юникод) или Java (в котором юникод был с самого начала), в php поддержку Юникода нам обещают только в шестой версии. Решит ли это проблему с использованием строковых функций ядра на Строках с юникодом. Как например в случае с substr() ? Незнаю. Покажет время. Хотя RC версии php6 уже доступны. Кому не ленива - могут проверить.</p>
<p>Что же остаться программисту? Всегда (если не требеутся обработка именно бинарных данных) использовать функции с префиксом <strong>mb_</strong> из модуля <strong>PHP_MBSTRING</strong>. Напомню, что использование строковых функций вроде <strong>substr(</strong>) на бинарных данных в свою очередь тоже не являться безопасным. Во-первых потому, что эти функции могут быть перезагруженны в модуле <strong>PHP_MBSTRING</strong>. Во-вторых реализация этих функций действительно может измениться в последующих версиях PHP. А всё потому, что эти функции по хорошему не предназначенны для обработки бинарных данных.</p>
<p>Возможно самым самым универсальным вариантом будет использование дополнительного пользовательского класса. Вроде класса <strong>IPSText</strong> из <strong>IPB3</strong>, в котором переопределены все строковые функции. Это безусловно усложнит программу и увеличит время выполнение. Но сделает код менезависимым от переменного окружения.</p>
<p>И на последок: скорее всего рассматриваемая проблема решена на уровне фреймфорков или есть интересные варианты в <strong>PEAR</strong>. Поэтому если вы используете такие инструменты программирования - лучше для начала поискать там.</p>
<h2>Ссылки по теме</h2>
<p>Подробнее о том, как конфигурить php можно почитать сдесь: <a href="http://ru2.php.net/manual/en/ini.php">http://ru2.php.net/manual/en/ini.php</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.filosof.name/articles/error-in-converter-to-ipb3.xhtml/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

