<?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>Ars Longa, Vita Brevis &#187; utf8</title>
	<atom:link href="http://blog.sjinks.pro/tag/utf8/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.sjinks.pro</link>
	<description>Quod scripsi, scripsi</description>
	<lastBuildDate>Mon, 06 Feb 2012 17:56:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Simple Tags 1.7.4.4: The New Bugs</title>
		<link>http://blog.sjinks.pro/wordpress/patches/782-simple-tags-1-7-4-4-the-new-bugs/</link>
		<comments>http://blog.sjinks.pro/wordpress/patches/782-simple-tags-1-7-4-4-the-new-bugs/#comments</comments>
		<pubDate>Tue, 23 Mar 2010 14:04:55 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Патчи]]></category>
		<category><![CDATA[Simple Tags]]></category>
		<category><![CDATA[utf8]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[плагин]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=782</guid>
		<description><![CDATA[Исправляем старые и новые ошибки Сегодня наконец-то появилось время обновить старые плагины; в их числе оказался и Simple Tags. Честно говоря, версия 1.7.4.4 меня разочаровала: автор сломал автоматические ссылки меток. Теперь они не работают даже для английского языка. Резюмируя: в данной версии нужно исправить: автоматические ссылки меток; поддержку многобайтовых символов в автоматических ссылках; вызов register_uninstall_hook() при [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/782-simple-tags-1-7-4-4-the-new-bugs/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Исправляем старые и новые ошибки</em></h2>
<p>Сегодня наконец-то появилось время обновить старые плагины; в их числе оказался и <a href="http://blog.sjinks.pro/tag/simple-tags/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Simple Tags">Simple Tags</a>. Честно говоря, версия 1.7.4.4 меня разочаровала: автор сломал автоматические ссылки меток. Теперь они не работают даже для английского языка.</p>
<p>Резюмируя: в данной версии нужно исправить:</p>
<ul>
<li>автоматические ссылки меток;</li>
<li><a href="http://blog.sjinks.pro/wordpress/plugins/566-simpletags-166-and-auto-link-tags-in-russian/">поддержку многобайтовых символов в автоматических ссылках</a>;</li>
<li><a href="http://blog.sjinks.pro/wordpress/plugins/757-simple-tags-1-7-4-2/">вызов <code>register_uninstall_hook()</code> при каждом обращении к блогу</a>.</li>
</ul>
<p><span id="more-782"></span></p>
<p>Проблема с автоматическими ссылками возникла из-за невнимательности автора:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p7823">
        <div class="code php" id="p782code3">
&nbsp; &nbsp; <span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">randomArray</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">link_tags</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; <span class="co1">//...</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="co1">// only continue if the database actually returned any links</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="kw1">isset</span><span class="br0">&#40;</span><span class="re0">$link_tags</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="kw3">is_array</span><span class="br0">&#40;</span><span class="re0">$link_tags</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$link_tags</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> <span class="nu0">0</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
        </div>
    </div>
</div>

<p>Метод <code>randomArray()</code> теперь не возвращает массив (как это было в предыдущих версиях плагина), а изменяет тот массив, который передан ему в параметрах (<span class="codebox"><code class="php"><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">link_tags</span></code></span>). Но если раньше результат <span class="codebox"><code class="php"><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">randomArray</span><span class="br0">&#40;</span><span class="re0">$this</span><span class="sy0">-&gt;</span><span class="me1">link_tags</span><span class="br0">&#41;</span></code></span> присваивался переменной <span class="codebox"><code class="php"><span class="re0">$link_tags</span></code></span>, то теперь эта переменная исчезла, и условие в <span class="codebox"><code class="php"><span class="kw1">if</span></code></span> теперь всегда ложно.</p>
<p><a href="http://blog.sjinks.pro/tag/patch/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  патч">Патч</a> для плагина (unified diff):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p7824">
        <div class="code diff" id="p782code4">
diff -uwdBrN simple-tags/inc/client.php simple-tags.new/inc/client.php<br />
<span class="re3">--- simple-tags/inc/client.php&nbsp; <span class="nu0">2010</span>-03-<span class="nu0">23</span> <span class="nu0">14</span>:01:<span class="nu0">55.000000000</span> +0200</span><br />
<span class="re4">+++ simple-tags.new/inc/client.php&nbsp; <span class="nu0">2010</span>-03-<span class="nu0">23</span> <span class="nu0">15</span>:<span class="nu0">14</span>:<span class="nu0">40.000000000</span> +0200</span><br />
<span class="re6">@@ -<span class="nu0">122</span>,<span class="nu0">8</span> +<span class="nu0">122</span>,<span class="nu0">8</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; // Shuffle array<br />
<span class="re7">- &nbsp; &nbsp; &nbsp; $this-&gt;randomArray<span class="br0">&#40;</span>$this-&gt;link_tags<span class="br0">&#41;</span>;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; </span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; $link_tags = $this-&gt;link_tags;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; $this-&gt;randomArray<span class="br0">&#40;</span>$link_tags<span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; // HTML Rel <span class="br0">&#40;</span>tag/no-follow<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; $rel = $this-&gt;buildRel<span class="br0">&#40;</span> $this-&gt;options<span class="br0">&#91;</span>'no_follow'<span class="br0">&#93;</span> <span class="br0">&#41;</span>;<br />
<span class="re6">@@ -<span class="nu0">157</span>,<span class="nu0">8</span> +<span class="nu0">157</span>,<span class="nu0">9</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $filtered = ''; // will filter text token by token<br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $match = &quot;/\b&quot; . preg_quote<span class="br0">&#40;</span>$term_name, &quot;/&quot;<span class="br0">&#41;</span> . &quot;\b/&quot;.$case;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $substitute = '&lt;a href=&quot;'.$term_link.'&quot; class=&quot;st_tag internal_tag&quot; '.$rel.' title=&quot;'. esc_attr<span class="br0">&#40;</span> sprintf<span class="br0">&#40;</span> __<span class="br0">&#40;</span>'Posts tagged with %s', 'simpletags'<span class="br0">&#41;</span>, $term_name <span class="br0">&#41;</span> <span class="br0">&#41;</span>.&quot;\&quot;&gt;$0&lt;/a&gt;&quot;;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $quoted = preg_quote<span class="br0">&#40;</span>$term_name, &quot;/&quot;<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $match = '/<span class="br0">&#40;</span>\PL|\A<span class="br0">&#41;</span><span class="br0">&#40;</span>' . $quoted . '<span class="br0">&#41;</span><span class="br0">&#40;</span>\PL|\Z<span class="br0">&#41;</span>/u'.$case;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $substitute = '$1&lt;a href=&quot;'.$term_link.'&quot; class=&quot;st_tag internal_tag&quot; '.$rel.' title=&quot;'. esc_attr<span class="br0">&#40;</span> sprintf<span class="br0">&#40;</span> __<span class="br0">&#40;</span>'Posts tagged with %s', 'simpletags'<span class="br0">&#41;</span>, $term_name <span class="br0">&#41;</span> <span class="br0">&#41;</span>.&quot;\&quot;&gt;$2&lt;/a&gt;$3&quot;;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // for efficiency only tokenize if forced to do so<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span> $must_tokenize <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
diff -uwdBrN simple-tags/inc/inc.functions.php simple-tags.new/inc/inc.functions.php<br />
<span class="re3">--- simple-tags/inc/inc.functions.php &nbsp; <span class="nu0">2010</span>-03-<span class="nu0">23</span> <span class="nu0">14</span>:01:<span class="nu0">55.000000000</span> +0200</span><br />
<span class="re4">+++ simple-tags.new/inc/inc.functions.php &nbsp; <span class="nu0">2010</span>-03-<span class="nu0">23</span> <span class="nu0">15</span>:09:<span class="nu0">06.000000000</span> +0200</span><br />
<span class="re6">@@ -<span class="nu0">4</span>,<span class="nu0">6</span> +<span class="nu0">4</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; *<br />
&nbsp; */<br />
&nbsp;function SimpleTags_Install<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re8">+ &nbsp; register_uninstall_hook <span class="br0">&#40;</span>dirname<span class="br0">&#40;</span>__FILE__<span class="br0">&#41;</span> . '/simple-tags.php', 'SimpleTags_Uninstall' <span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; $options_from_table = get_option<span class="br0">&#40;</span> STAGS_OPTIONS_NAME <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; if <span class="br0">&#40;</span> $options_from_table == false <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; $options = <span class="br0">&#40;</span>array<span class="br0">&#41;</span> include<span class="br0">&#40;</span> dirname<span class="br0">&#40;</span>__FILE__<span class="br0">&#41;</span> . '/default.options.php' <span class="br0">&#41;</span>;<br />
diff -uwdBrN simple-tags/simple-tags.php simple-tags.new/simple-tags.php<br />
<span class="re3">--- simple-tags/simple-tags.php <span class="nu0">2010</span>-03-<span class="nu0">23</span> <span class="nu0">14</span>:01:<span class="nu0">55.000000000</span> +0200</span><br />
<span class="re4">+++ simple-tags.new/simple-tags.php <span class="nu0">2010</span>-03-<span class="nu0">23</span> <span class="nu0">15</span>:07:<span class="nu0">42.000000000</span> +0200</span><br />
<span class="re6">@@ -<span class="nu0">3</span>,<span class="nu0">7</span> +<span class="nu0">3</span>,<span class="nu0">7</span> @@</span><br />
&nbsp;Plugin Name: Simple Tags<br />
&nbsp;Plugin URI: http://redmine.beapi.fr/projects/show/simple-tags<br />
&nbsp;Description: Extended Tagging for WordPress 2.8 and 2.9 ! Suggested Tags, Mass edit tags, Autocompletion, Tag Cloud Widgets, Related Posts, Related Tags, etc!<br />
<span class="re7">-Version: 1.7.4.4</span><br />
<span class="re8">+Version: 1.7.4.4.1</span><br />
&nbsp;Author: Amaury BALMER<br />
&nbsp;Author URI: http://www.herewithme.fr<br />
&nbsp;Text Domain: simpletags<br />
<span class="re6">@@ -<span class="nu0">23</span>,<span class="nu0">6</span> +<span class="nu0">23</span>,<span class="nu0">7</span> @@</span><br />
&nbsp;Contributors:<br />
&nbsp;- Kevin Drouvin <span class="br0">&#40;</span>kevin.drouvin@gmail.com - http://inside-dev.net<span class="br0">&#41;</span><br />
&nbsp;- Martin Modler <span class="br0">&#40;</span>modler@webformatik.com - http://www.webformatik.com<span class="br0">&#41;</span><br />
<span class="re8">+- Vladimir Kolesnikov &lt;vladimir at extrememember dot com&gt; - http://blog.sjinks.pro/</span><br />
&nbsp;<br />
&nbsp;Todo:<br />
&nbsp; &nbsp; Both :<br />
<span class="re6">@@ -<span class="nu0">55</span>,<span class="nu0">9</span> +<span class="nu0">56</span>,<span class="nu0">8</span> @@</span><br />
&nbsp;require<span class="br0">&#40;</span> STAGS_DIR . '/inc/tpl.functions.php'<span class="br0">&#41;</span>; // Templates functions<br />
&nbsp;require<span class="br0">&#40;</span> STAGS_DIR . '/inc/widgets.php'<span class="br0">&#41;</span>; &nbsp;&nbsp; &nbsp; // Widgets<br />
&nbsp;<br />
<span class="re7">-// Activation, uninstall</span><br />
<span class="re8">+// Activation</span><br />
&nbsp;register_activation_hook<span class="br0">&#40;</span>__FILE__, 'SimpleTags_Install' &nbsp; <span class="br0">&#41;</span>;<br />
<span class="re7">-register_uninstall_hook <span class="br0">&#40;</span>__FILE__, 'SimpleTags_Uninstall' <span class="br0">&#41;</span>;</span><br />
&nbsp;<br />
&nbsp;// Init ST<br />
&nbsp;function simple_tags_init<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        </div>
    </div>
</div>

<p>Для тех, кто патчи не любит, есть исправленная версия плагина (из исходного архива также удалены скриншоты): <strong><a href="http://d.sjinks.pro/wordpress/simple-tags-1.7.4.4.1.zip">скачать Simple Tags 1.7.4.4.1</a></strong></p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/782-simple-tags-1-7-4-4-the-new-bugs/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/patches/782-simple-tags-1-7-4-4-the-new-bugs/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Simple Tags 1.7.4.2</title>
		<link>http://blog.sjinks.pro/wordpress/plugins/757-simple-tags-1-7-4-2/</link>
		<comments>http://blog.sjinks.pro/wordpress/plugins/757-simple-tags-1-7-4-2/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 10:27:37 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Плагины WordPress]]></category>
		<category><![CDATA[Simple Tags]]></category>
		<category><![CDATA[utf8]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[плагин]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=757</guid>
		<description><![CDATA[Недавно вышла очередная версия плагина Simple Tags. Проблема с UTF-8/многобайтными строками осталась (нужно бы написать автору ещё раз). Вдобавок появилась проблема с вызовом register_uninstall_hook() при каждой загрузки страницы (я исправлял аналогичную проблему с NextGen Gallery). Из плюсов: Simple Tags 1.7.4.2 нормально работает с WordPress 3.0. Исправленная версия плагина Simple Tags 1.7.4.2 (я убрал их исходного архива скриншоты — вряд ли [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/plugins/757-simple-tags-1-7-4-2/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<p>Недавно вышла очередная версия плагина <a href="http://wordpress.org/extend/plugins/simple-tags/">Simple Tags</a>. <a href="http://blog.sjinks.pro/wordpress/patches/372-simple-tags-auto-link-tags-in-russian/">Проблема с UTF-8/многобайтными строками</a> осталась (нужно бы написать автору ещё раз). Вдобавок появилась проблема с вызовом <code>register_uninstall_hook()</code> при каждой загрузки страницы (я исправлял <a href="http://blog.sjinks.pro/wordpress/patches/703-yet-another-nextgen-gallery-optimization/">аналогичную проблему</a> с NextGen Gallery).</p>
<p>Из плюсов: <a href="http://blog.sjinks.pro/tag/simple-tags/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Simple Tags">Simple Tags</a> 1.7.4.2 нормально работает с <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a> 3.0.<span id="more-757"></span></p>
<p><strong><a href="http://d.sjinks.pro/wordpress/simple-tags.1.7.4.2.1.zip">Исправленная версия плагина Simple Tags 1.7.4.2</a></strong> (я убрал их исходного архива скриншоты — вряд ли кто их смотрит).</p>
<p>Патч:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p7576">
        <div class="code diff" id="p757code6">
diff -uwdBrN simple-tags.orig/inc/base.php simple-tags/inc/base.php<br />
<span class="re3">--- simple-tags.orig/inc/base.php &nbsp; <span class="nu0">2010</span>-02-02 <span class="nu0">22</span>:<span class="nu0">39</span>:<span class="nu0">08.000000000</span> +0200</span><br />
<span class="re4">+++ simple-tags/inc/base.php&nbsp; &nbsp; <span class="nu0">2010</span>-02-03 <span class="nu0">11</span>:<span class="nu0">26</span>:<span class="nu0">48.000000000</span> +0200</span><br />
<span class="re6">@@ -<span class="nu0">41</span>,<span class="nu0">6</span> +<span class="nu0">41</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; &nbsp;*<br />
&nbsp; &nbsp; &nbsp;*/<br />
&nbsp; &nbsp; function installSimpleTags<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; register_uninstall_hook <span class="br0">&#40;</span>WP_PLUGIN_DIR . '/simple-tags/simple-tags.php', array<span class="br0">&#40;</span>'SimpleTagsBase', 'uninstall'<span class="br0">&#41;</span> <span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; $options_from_table = get_option<span class="br0">&#40;</span> STAGS_OPTIONS_NAME <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span> $options_from_table == false <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $this-&gt;resetToDefaultOptions<span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
diff -uwdBrN simple-tags.orig/inc/client.php simple-tags/inc/client.php<br />
<span class="re3">--- simple-tags.orig/inc/client.php <span class="nu0">2010</span>-02-02 <span class="nu0">22</span>:<span class="nu0">39</span>:<span class="nu0">08.000000000</span> +0200</span><br />
<span class="re4">+++ simple-tags/inc/client.php&nbsp; <span class="nu0">2010</span>-02-03 <span class="nu0">11</span>:<span class="nu0">39</span>:<span class="nu0">18.000000000</span> +0200</span><br />
<span class="re6">@@ -<span class="nu0">141</span>,<span class="nu0">8</span> +<span class="nu0">141</span>,<span class="nu0">9</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $filtered = ''; // will filter text token by token<br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $match = &quot;/\b&quot; . preg_quote<span class="br0">&#40;</span>$term_name, &quot;/&quot;<span class="br0">&#41;</span> . &quot;\b/&quot;.$case;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $substitute = '&lt;a href=&quot;'.$term_link.'&quot; class=&quot;st_tag internal_tag&quot; '.$rel.' title=&quot;'. esc_attr<span class="br0">&#40;</span> sprintf<span class="br0">&#40;</span> __<span class="br0">&#40;</span>'Posts tagged with %s', 'simpletags'<span class="br0">&#41;</span>, $term_name <span class="br0">&#41;</span> <span class="br0">&#41;</span>.&quot;\&quot;&gt;$0&lt;/a&gt;&quot;;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $quoted = preg_quote<span class="br0">&#40;</span>$term_name, &quot;/&quot;<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $match = &quot;/<span class="br0">&#40;</span>\PL|\A<span class="br0">&#41;</span><span class="br0">&#40;</span>&quot; . preg_quote<span class="br0">&#40;</span>$term_name, &quot;/&quot;<span class="br0">&#41;</span> . &quot;<span class="br0">&#41;</span><span class="br0">&#40;</span>\PL|\Z<span class="br0">&#41;</span>/u&quot;.$case;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $substitute = '$1&lt;a href=&quot;'.$term_link.'&quot; class=&quot;st_tag internal_tag&quot; '.$rel.' title=&quot;'. attribute_escape<span class="br0">&#40;</span> sprintf<span class="br0">&#40;</span> __<span class="br0">&#40;</span>'Posts tagged with %s', 'simpletags'<span class="br0">&#41;</span>, $term_name <span class="br0">&#41;</span> <span class="br0">&#41;</span>.&quot;\&quot;&gt;$2&lt;/a&gt;$3&quot;;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // for efficiency only tokenize if forced to do so<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span> $must_tokenize <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
diff -uwdBrN simple-tags.orig/simple-tags.php simple-tags/simple-tags.php<br />
<span class="re3">--- simple-tags.orig/simple-tags.php&nbsp; &nbsp; <span class="nu0">2010</span>-02-02 <span class="nu0">22</span>:<span class="nu0">39</span>:<span class="nu0">08.000000000</span> +0200</span><br />
<span class="re4">+++ simple-tags/simple-tags.php <span class="nu0">2010</span>-02-03 <span class="nu0">11</span>:<span class="nu0">42</span>:<span class="nu0">14.000000000</span> +0200</span><br />
<span class="re6">@@ -<span class="nu0">3</span>,<span class="nu0">7</span> +<span class="nu0">3</span>,<span class="nu0">7</span> @@</span><br />
&nbsp;Plugin Name: Simple Tags<br />
&nbsp;Plugin URI: http://redmine.beapi.fr/projects/show/simple-tags<br />
&nbsp;Description: Extended Tagging for WordPress 2.8 and 2.9 ! Suggested Tags, Mass edit tags, Autocompletion, Tag Cloud Widgets, Related Posts, Related Tags, etc!<br />
<span class="re7">-Version: 1.7.4.2</span><br />
<span class="re8">+Version: 1.7.4.2.1</span><br />
&nbsp;Author: Amaury BALMER<br />
&nbsp;Author URI: http://www.herewithme.fr<br />
&nbsp;Text Domain: simpletags<br />
<span class="re6">@@ -<span class="nu0">23</span>,<span class="nu0">6</span> +<span class="nu0">23</span>,<span class="nu0">7</span> @@</span><br />
&nbsp;Contributors:<br />
&nbsp;- Kevin Drouvin <span class="br0">&#40;</span>kevin.drouvin@gmail.com - http://inside-dev.net<span class="br0">&#41;</span><br />
&nbsp;- Martin Modler <span class="br0">&#40;</span>modler@webformatik.com - http://www.webformatik.com<span class="br0">&#41;</span><br />
<span class="re8">+- Vladimir Kolesnikov &lt;vladimir at extrememember dot com&gt; - http://blog.sjinks.pro/</span><br />
&nbsp;<br />
&nbsp;Todo:<br />
&nbsp; &nbsp; Both :<br />
<span class="re6">@@ -<span class="nu0">53</span>,<span class="nu0">7</span> +<span class="nu0">54</span>,<span class="nu0">6</span> @@</span><br />
&nbsp;<br />
&nbsp;// Activation, uninstall<br />
&nbsp;register_activation_hook<span class="br0">&#40;</span>__FILE__, array<span class="br0">&#40;</span>'SimpleTagsBase', 'installSimpleTags'<span class="br0">&#41;</span> <span class="br0">&#41;</span>;<br />
<span class="re7">-register_uninstall_hook <span class="br0">&#40;</span>__FILE__, array<span class="br0">&#40;</span>'SimpleTagsBase', 'uninstall'<span class="br0">&#41;</span> <span class="br0">&#41;</span>;</span><br />
&nbsp;<br />
&nbsp;// Init ST<br />
&nbsp;function simple_tags_init<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        </div>
    </div>
</div>

<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/plugins/757-simple-tags-1-7-4-2/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/plugins/757-simple-tags-1-7-4-2/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Simple Tags 1.6.6 и автоматические ссылки меток на русском языке</title>
		<link>http://blog.sjinks.pro/wordpress/plugins/566-simpletags-166-and-auto-link-tags-in-russian/</link>
		<comments>http://blog.sjinks.pro/wordpress/plugins/566-simpletags-166-and-auto-link-tags-in-russian/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 02:22:35 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Патчи]]></category>
		<category><![CDATA[Плагины WordPress]]></category>
		<category><![CDATA[Simple Tags]]></category>
		<category><![CDATA[utf8]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[плагин]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=566</guid>
		<description><![CDATA[Время идёт, проблемы остаются… Полгода назад я рассказывал о том, что Simple Tags не умеет работать с многобайтовыми символами (коими, к слову, являются русские буквы в кодировке UTF-8). За это время вышло восемь или девять новых версий плагина, но проблема с поддержкой UTF-8 всё же осталась. Так сложилось, что именно сегодня я решил обновить плагин. [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/plugins/566-simpletags-166-and-auto-link-tags-in-russian/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Время идёт, проблемы остаются…</em></h2>
<p>Полгода назад я рассказывал о том, что <a href="http://blog.sjinks.pro/tag/simple-tags/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Simple Tags">Simple Tags</a> <a href="http://blog.sjinks.pro/wordpress/patches/372-simple-tags-auto-link-tags-in-russian/">не умеет работать с многобайтовыми символами</a> (коими, к слову, являются русские буквы в кодировке UTF-8). За это время вышло восемь или девять новых версий плагина, но проблема с поддержкой UTF-8 всё же осталась.</p>
<p>Так сложилось, что именно сегодня я решил обновить <a href="http://blog.sjinks.pro/tag/plugin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  плагин">плагин</a>. Патчить код было лень, я надеялся, что у <a href="http://lecactus.ru/2007/10/07/851/">Lecactus&#8217;а</a> лежит пропатченная свежая версия. Увы, только 1.6.3.<span id="more-566"></span></p>
<p>Для тех, кто больше любит патчи (unified diff):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5669">
        <div class="code diff" id="p566code9">
diff -uwdBrN simple-tags/simple-tags.php simple-tags.new/simple-tags.php<br />
<span class="re3">--- simple-tags/simple-tags.php <span class="nu0">2009</span>-04-<span class="nu0">22</span> <span class="nu0">10</span>:<span class="nu0">22</span>:<span class="nu0">28.000000000</span> -0400</span><br />
<span class="re4">+++ simple-tags.new/simple-tags.php &nbsp; &nbsp; <span class="nu0">2009</span>-06-01 <span class="nu0">21</span>:<span class="nu0">50</span>:<span class="nu0">20.000000000</span> -0400</span><br />
<span class="re6">@@ -<span class="nu0">3</span>,<span class="nu0">7</span> +<span class="nu0">3</span>,<span class="nu0">7</span> @@</span><br />
&nbsp;Plugin Name: Simple Tags<br />
&nbsp;Plugin URI: http://wordpress.org/extend/plugins/simple-tags<br />
&nbsp;Description: Simple Tags : Extended Tagging for WordPress 2.3, 2.5, 2.6 and 2.7 ! Autocompletion, Suggested Tags, Tag Cloud Widgets, Related Posts, Mass edit tags !<br />
<span class="re7">-Version: 1.6.6</span><br />
<span class="re8">+Version: 1.6.6.1</span><br />
&nbsp;Author: Amaury BALMER<br />
&nbsp;Author URI: http://www.herewithme.fr<br />
<br />
<span class="re6">@@ -<span class="nu0">22</span>,<span class="nu0">6</span> +<span class="nu0">22</span>,<span class="nu0">7</span> @@</span><br />
&nbsp;Contributors:<br />
&nbsp;- Kevin Drouvin <span class="br0">&#40;</span>kevin.drouvin@gmail.com - http://inside-dev.net<span class="br0">&#41;</span><br />
&nbsp;- Martin Modler <span class="br0">&#40;</span>modler@webformatik.com - http://www.webformatik.com<span class="br0">&#41;</span><br />
<span class="re8">+- Vladimir Kolesnikov <span class="br0">&#40;</span>vladimir at extrememember dot com - http://blog.sjinks.pro<span class="br0">&#41;</span></span><br />
<br />
&nbsp;Todo:<br />
&nbsp; &nbsp; &nbsp; &nbsp; Admin<br />
<span class="re6">@@ -<span class="nu0">30</span>,<span class="nu0">25</span> +<span class="nu0">31</span>,<span class="nu0">6</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - Verifier la case du remplacement par les liens<br />
&nbsp;*/<br />
<br />
<span class="re7">-// Check version.</span><br />
<span class="re7">-global $wp_version;</span><br />
<span class="re7">-if <span class="br0">&#40;</span> strpos<span class="br0">&#40;</span>$wp_version, '2.7'<span class="br0">&#41;</span> !== false || strpos<span class="br0">&#40;</span>$wp_version, '<span class="nu0">2.8</span>'<span class="br0">&#41;</span> !== false &nbsp;<span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; require<span class="br0">&#40;</span>dirname<span class="br0">&#40;</span>__FILE__<span class="br0">&#41;</span>.'/2.7/simple-tags.client.php'<span class="br0">&#41;</span>;<br />
<span class="re7">-<span class="br0">&#125;</span> elseif <span class="br0">&#40;</span> strpos<span class="br0">&#40;</span>$wp_version, '2.5'<span class="br0">&#41;</span> !== false || strpos<span class="br0">&#40;</span>$wp_version, '<span class="nu0">2.6</span>'<span class="br0">&#41;</span> !== false &nbsp;<span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; require<span class="br0">&#40;</span>dirname<span class="br0">&#40;</span>__FILE__<span class="br0">&#41;</span>.'/2.5/simple-tags.client.php'<span class="br0">&#41;</span>;</span><br />
<span class="re7">-<span class="br0">&#125;</span> elseif <span class="br0">&#40;</span> strpos<span class="br0">&#40;</span>$wp_version, '<span class="nu0">2.3</span>'<span class="br0">&#41;</span> !== false <span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; require<span class="br0">&#40;</span>dirname<span class="br0">&#40;</span>__FILE__<span class="br0">&#41;</span>.'/2.3/simple-tags.client.php'<span class="br0">&#41;</span>;</span><br />
<span class="re7">-<span class="br0">&#125;</span> elseif <span class="br0">&#40;</span> strpos<span class="br0">&#40;</span>$wp_version, '2.2'<span class="br0">&#41;</span> !== false || strpos<span class="br0">&#40;</span>$wp_version, '2.1'<span class="br0">&#41;</span> !== false || strpos<span class="br0">&#40;</span>$wp_version, '<span class="nu0">2.0</span>'<span class="br0">&#41;</span> !== false <span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; add_action<span class="br0">&#40;</span>'admin_notices', 'simple_tagging_warning'<span class="br0">&#41;</span>;</span><br />
<span class="re7">-<span class="br0">&#125;</span> else <span class="br0">&#123;</span></span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; add_action<span class="br0">&#40;</span>'admin_notices', 'simple_tags_warning'<span class="br0">&#41;</span>;</span><br />
<span class="re7">-<span class="br0">&#125;</span></span><br />
<br />
<span class="re7">-function simple_tagging_warning<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; echo '&lt;div class=&quot;updated fade&quot;&gt;&lt;p&gt;&lt;strong&gt;'.__<span class="br0">&#40;</span>'Simple Tags can\'t work with this WordPress version !', 'simpletags'<span class="br0">&#41;</span>.'&lt;/strong&gt; '.sprintf<span class="br0">&#40;</span>__<span class="br0">&#40;</span>'You must use &lt;a href=&quot;%1$s&quot;&gt;Simple Tagging Plugin&lt;/a&gt; for it to work.', 'simpletags'<span class="br0">&#41;</span></span><br />
, 'http://wordpress.org/extend/plugins/simple-tagging-plugin/'<span class="br0">&#41;</span>.'&lt;/p&gt;&lt;/div&gt;';<br />
<span class="re7">-<span class="br0">&#125;</span></span><br />
<span class="re7">-</span><br />
<span class="re7">-function simple_tags_warning<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; echo '&lt;div class=&quot;updated fade&quot;&gt;&lt;p&gt;&lt;strong&gt;'.__<span class="br0">&#40;</span>'Simple Tags can\'t work with this WordPress version !', 'simpletags'<span class="br0">&#41;</span>.'&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;';</span><br />
<span class="re7">-<span class="br0">&#125;</span></span><br />
&nbsp;?&gt;<br />
<span class="kw1">\ No newline at end of file</span>
        </div>
    </div>
</div>

          
<div class="codebox">
    <div class="the_code" style="" id="p56610">
        <div class="code diff" id="p566code10">
diff -uwdBrN simple-tags/2.7/simple-tags.client.php simple-tags.new/2.7/simple-tags.client.php<br />
<span class="re3">--- simple-tags/<span class="nu0">2.7</span>/simple-tags.client.php &nbsp; &nbsp; &nbsp;<span class="nu0">2009</span>-04-<span class="nu0">22</span> <span class="nu0">10</span>:<span class="nu0">22</span>:<span class="nu0">28.000000000</span> -0400</span><br />
<span class="re4">+++ simple-tags.new/<span class="nu0">2.7</span>/simple-tags.client.php &nbsp;<span class="nu0">2009</span>-06-01 <span class="nu0">22</span>:02:<span class="nu0">04.000000000</span> -0400</span><br />
<span class="re6">@@ -<span class="nu0">1</span>,<span class="nu0">6</span> +<span class="nu0">1</span>,<span class="nu0">6</span> @@</span><br />
&nbsp;&lt;?php<br />
&nbsp;class SimpleTags <span class="br0">&#123;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; var $version = '1.6.6';</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; var $version = '1.6.6.1';</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; var $info;<br />
&nbsp; &nbsp; &nbsp; &nbsp; var $options;<br />
<span class="re6">@@ -<span class="nu0">274</span>,<span class="nu0">8</span> +<span class="nu0">274</span>,<span class="nu0">9</span> @@</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach <span class="br0">&#40;</span> <span class="br0">&#40;</span>array<span class="br0">&#41;</span> $link_tags as $term_name =&gt; $term_link <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $filtered = &quot;&quot;; // will filter text token by token<br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $match = &quot;/\b&quot; . preg_quote<span class="br0">&#40;</span>$term_name, &quot;/&quot;<span class="br0">&#41;</span> . &quot;\b/&quot;.$case;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $substitute = '&lt;a href=&quot;'.$term_link.'&quot; class=&quot;st_tag internal_tag&quot; '.$rel.' title=&quot;'. attribute_escape<span class="br0">&#40;</span> sprintf<span class="br0">&#40;</span> __<span class="br0">&#40;</span>'Posts tagged with %s', 'simpletags'<span class="br0">&#41;</span>, $term_name <span class="br0">&#41;</span> <span class="br0">&#41;</span>.&quot;\&quot;&gt;$0&lt;/a&gt;&quot;;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $quoted = preg_quote<span class="br0">&#40;</span>$term_name, &quot;/&quot;<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $match = &quot;/<span class="br0">&#40;</span>\PL|\A<span class="br0">&#41;</span><span class="br0">&#40;</span>&quot; . preg_quote<span class="br0">&#40;</span>$term_name, &quot;/&quot;<span class="br0">&#41;</span> . &quot;<span class="br0">&#41;</span><span class="br0">&#40;</span>\PL|\Z<span class="br0">&#41;</span>/u&quot;.$case;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $substitute = '$1&lt;a href=&quot;'.$term_link.'&quot; class=&quot;st_tag internal_tag&quot; '.$rel.' title=&quot;'. attribute_escape<span class="br0">&#40;</span> sprintf<span class="br0">&#40;</span> __<span class="br0">&#40;</span>'Posts tagged with %s', 'simpletags'<span class="br0">&#41;</span>, $term_name <span class="br0">&#41;</span> <span class="br0">&#41;</span>.&quot;\&quot;&gt;$2&lt;/a&gt;$3&quot;;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // for efficiency only tokenize if forced to do so<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span> $must_tokenize <span class="br0">&#41;</span> <span class="br0">&#123;</span>
        </div>
    </div>
</div>

<p>Для тех, кто предпочитает готовое: <strong><a href="http://static.sjinks.info/wp-content/uploads/2009/06/simple-tags-1.6.6.1.zip">скачать исправленную версию плагина Simple Tags 1.6.6 для WordPress</a></strong>.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/plugins/566-simpletags-166-and-auto-link-tags-in-russian/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/plugins/566-simpletags-166-and-auto-link-tags-in-russian/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>Simple Tags и автоматические ссылки меток на русском языке</title>
		<link>http://blog.sjinks.pro/wordpress/patches/372-simple-tags-auto-link-tags-in-russian/</link>
		<comments>http://blog.sjinks.pro/wordpress/patches/372-simple-tags-auto-link-tags-in-russian/#comments</comments>
		<pubDate>Sat, 22 Nov 2008 06:03:48 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Патчи]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Simple Tags]]></category>
		<category><![CDATA[utf8]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[плагин]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=372</guid>
		<description><![CDATA[Добавляем поддержку многобайтных символов в Simple Tags Сегодня у Lecacus&#8217;а на сайте наткнулся на упоминание одной нерешённой проблемы: У меня не работают автоматические ссылки меток в содержимом записи для меток на русском языке. Т.е. если есть метка «wordpress», то слово «wordpress» заменяется на ссылку http://myblog.net/tag/wordpress/. А вот если есть метка «спорт», то слово «спорт» ссылкой [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/372-simple-tags-auto-link-tags-in-russian/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Добавляем поддержку многобайтных символов в <a href="http://blog.sjinks.pro/tag/simple-tags/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Simple Tags">Simple Tags</a></em></h2>
<p>Сегодня у Lecacus&#8217;а на <a href="http://lecactus.ru/2007/10/07/851/" rel="nofollow">сайте</a> наткнулся на упоминание одной нерешённой проблемы:</p>
<blockquote cite="http://lecactus.ru/2007/10/07/851/#comment-20848">У меня не работают автоматические ссылки меток в содержимом записи для меток на русском языке. Т.е. если есть метка «<a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">wordpress</a>», то слово «<a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">wordpress</a>» заменяется на ссылку <span class="codebox"><code class="text">http://myblog.net/tag/wordpress/</code></span>. А вот если есть метка «спорт», то слово «спорт» ссылкой не заменяется. Подскажите как сделать так, чтобы <a href="http://blog.sjinks.pro/tag/plugin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  плагин">плагин</a> работал и с русскими метками.</blockquote>
<p>А так как сегодня мне уже пришлось иметь дело с Simple Tags, я решил разобраться, в чём же дело и исправить досадный баг.<span id="more-372"></span></p>
<p>Сам по себе код плагина довольно-таки простой (что определённо делает честь автору), но регулярные выражения, использованные в коде, требуют некоторых знаний и навыков.</p>
<p>За создание автоматических меток отвечает метод <span class="codebox"><code class="php">SimpleTags<span class="sy0">::</span><span class="me2">autoLinkTags</span></code></span>, основу которого составляют регулярные выражения из <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a> Markdown Михеля Фортина (Michel Fortin); замечу, что эти регулярные выражения исправлять не пришлось (хотя, по-хорошему, их можно упростить).</p>
<p>Сама <a href="http://blog.sjinks.pro/tag/bug/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  ошибка">ошибка</a> находится в данной строке:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p37215">
        <div class="code php" id="p372code15">
<ol class="php" style="font-family:monospace;" start="265"><li class="li1"><div class="de1"><span class="re0">$match</span> <span class="sy0">=</span> <span class="st0">&quot;/\b&quot;</span> <span class="sy0">.</span> <span class="kw3">preg_quote</span><span class="br0">&#40;</span><span class="re0">$term_name</span><span class="sy0">,</span> <span class="st0">&quot;/&quot;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st0">&quot;\b/&quot;</span><span class="sy0">.</span><span class="re0">$case</span><span class="sy0">;</span></div></li>
</ol>
        </div>
    </div>
</div>

<p>Очень многие &laquo;Забугорные&raquo; программисты (а также наши, работающие на иностранцев), привыкли считать, что нет иной кодовой таблицы, нежели iso-8859-x, что, собственно, и выражается в регулярном выражении.</p>
<p>Те, кто знаком с PCRE, знают, что \b&nbsp;&mdash;&nbsp;это граница слова. Но в локали по умолчанию русские буквы не попадают в категорию &laquo;буквы&raquo;; как следствие, регулярное выражение <code>/\bспорт\b/</code> не сработает.</p>
<p>Решение проблемы состоит в использовании <a href="http://www.php.net/manual/en/reference.pcre.pattern.syntax.php">классов символов Unicode</a> (то, что знают, увы, очень немногие программисты).</p>
<p>Фактически, нужно было проверять на нахождение не-буквы перед меткой и после метки; например, так:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p37216">
        <div class="code php" id="p372code16">
<span class="re0">$match</span> <span class="sy0">=</span> <span class="st0">&quot;/(\PL)(&quot;</span> <span class="sy0">.</span> <span class="kw3">preg_quote</span><span class="br0">&#40;</span><span class="re0">$term_name</span><span class="sy0">,</span> <span class="st0">&quot;/&quot;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st0">&quot;)(\PL)/u&quot;</span><span class="sy0">.</span><span class="re0">$case</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>Уже лучше, но работает не всегда. В частности, не будет работать, если метка идет сразу после открывающего тэга, либо сразу перед закрывающим тэгом (не сработает условие (\PL) в начале или в конце). Правильным решением будет следующее:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p37217">
        <div class="code php" id="p372code17">
<span class="re0">$match</span> <span class="sy0">=</span> <span class="st0">&quot;/(\PL|\A)(&quot;</span> <span class="sy0">.</span> <span class="kw3">preg_quote</span><span class="br0">&#40;</span><span class="re0">$term_name</span><span class="sy0">,</span> <span class="st0">&quot;/&quot;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st0">&quot;)(\PL|\Z)/u&quot;</span><span class="sy0">.</span><span class="re0">$case</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>Полное решение выглядит сложнее, но суть должна быть понятна.</p>
<p>Ниже приведён <a href="http://blog.sjinks.pro/tag/patch/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  патч">патч</a> в формате unified diff:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p37218">
        <div class="code diff" id="p372code18">
--- simple-tags.client.php.orig 2008-11-22 06:15:22.000000000 +0200 <br />
<span class="re4">+++ simple-tags.client.php &nbsp; &nbsp; &nbsp;<span class="nu0">2008</span>-<span class="nu0">11</span>-<span class="nu0">22</span> 07:<span class="nu0">53</span>:<span class="nu0">15.000000000</span> +0200 </span><br />
<span class="re6">@@ -<span class="nu0">262</span>,<span class="nu0">8</span> +<span class="nu0">262</span>,<span class="nu0">9</span> @@ </span><br />
&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach <span class="br0">&#40;</span> <span class="br0">&#40;</span>array<span class="br0">&#41;</span> $this-&gt;link_tags as $term_name =&gt; $term_link <span class="br0">&#41;</span> <span class="br0">&#123;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $filtered = &quot;&quot;; // will filter text token by token <br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $match = &quot;/\b&quot; . preg_quote<span class="br0">&#40;</span>$term_name, &quot;/&quot;<span class="br0">&#41;</span> . &quot;\b/&quot;.$case; </span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $substitute = '&lt;a href=&quot;'.$term_link.'&quot; class=&quot;st_tag internal_tag&quot; '.$rel.' title=&quot;'. attribute_escape<span class="br0">&#40;</span> sprintf<span class="br0">&#40;</span> __<span class="br0">&#40;</span>'Posts tagged with %s', 'simpletags'<span class="br0">&#41;</span>, $term_name <span class="br0">&#41;</span> <span class="br0">&#41;</span>.&quot;\&quot;&gt;$0&lt;/a&gt;&quot;;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $quoted = preg_quote<span class="br0">&#40;</span>$term_name, &quot;/&quot;<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $match = &quot;/<span class="br0">&#40;</span>\PL|\A<span class="br0">&#41;</span><span class="br0">&#40;</span>&quot; . preg_quote<span class="br0">&#40;</span>$term_name, &quot;/&quot;<span class="br0">&#41;</span> . &quot;<span class="br0">&#41;</span><span class="br0">&#40;</span>\PL|\Z<span class="br0">&#41;</span>/u&quot;.$case;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $substitute = '$1&lt;a href=&quot;'.$term_link.'&quot; class=&quot;st_tag internal_tag&quot; '.$rel.' title=&quot;'. attribute_escape<span class="br0">&#40;</span> sprintf<span class="br0">&#40;</span> __<span class="br0">&#40;</span>'Posts tagged with %s', 'simpletags'<span class="br0">&#41;</span>, $term_name <span class="br0">&#41;</span> <span class="br0">&#41;</span>.&quot;\&quot;&gt;$2&lt;/a&gt;$3&quot;;<br />
&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // for efficiency only tokenize if forced to do so <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span> $must_tokenize <span class="br0">&#41;</span> <span class="br0">&#123;</span>
        </div>
    </div>
</div>

<p><strong>Внимание:</strong> патч будет работать только если PHP собран с поддержкой UTF-8, если кодировка блога установлена в UTF-8 и соединение с базой данных тоже использует кодировку UTF-8. В принципе, ничего запредельного, <em>нормальная</em> инсталляция WordPress будет отвечать этим требованиям.</p>
<p>Те, кто не хотят заморачиваться с патчем, могут скачать пропатченную версию (но она требует как минимум WordPress&nbsp;2.5).</p>
<p><strong><a href="http://d.sjinks.pro/wordpress/simple-tags-1.5.7.1.zip">Скачать Simple Tags 1.5.7.1</a>.</strong></p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/372-simple-tags-auto-link-tags-in-russian/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/patches/372-simple-tags-auto-link-tags-in-russian/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>WordPress 2.7 и Simple Tags</title>
		<link>http://blog.sjinks.pro/wordpress/patches/370-wordpress-27-and-simple-tags/</link>
		<comments>http://blog.sjinks.pro/wordpress/patches/370-wordpress-27-and-simple-tags/#comments</comments>
		<pubDate>Sat, 22 Nov 2008 04:14:51 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Патчи]]></category>
		<category><![CDATA[Simple Tags]]></category>
		<category><![CDATA[utf8]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[плагин]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=370</guid>
		<description><![CDATA[Как заставить Simple Tags работать в WordPress 2.7 Simple Tags — это плагин для WordPress, предназначенный для управления тэгами (или, как их еще называют, метками). Достоинств у плагина очень много (полный список — на официальной странице плагина), работает просто на «ура». Но, как обычно, в бочке мёда есть ложка дёгтя: плагин отказывается работать в WordPress 2.7. Причём довольно-таки по-глупому: номера [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/370-wordpress-27-and-simple-tags/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Как заставить <a href="http://blog.sjinks.pro/tag/simple-tags/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Simple Tags">Simple Tags</a> работать в <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a> 2.7</em></h2>
<p><a href="http://www.herewithme.fr/wordpress-plugins/simple-tags" rel="nofollow"><strong>Simple Tags</strong></a> — это <a href="http://blog.sjinks.pro/tag/plugin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  плагин">плагин</a> для WordPress, предназначенный для управления тэгами (или, как их еще называют, метками). Достоинств у плагина очень много (полный список — на <a href="http://wordpress.org/extend/plugins/simple-tags/">официальной странице плагина</a>), работает просто на «ура».</p>
<p>Но, как обычно, в бочке мёда есть ложка дёгтя: плагин отказывается работать в WordPress 2.7. Причём довольно-таки по-глупому: номера версий, с которыми плагин <em>хочет</em> работать, жёстко зашиты в коде. Если в список добавить 2.7, плагин будет работать.<span id="more-370"></span></p>
<p>По традиции, для таких случаев привожу <a href="http://blog.sjinks.pro/tag/patch/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  патч">патч</a> (в формате unified diff):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p37020">
        <div class="code diff" id="p370code20">
--- simple-tags.php.orig &nbsp; &nbsp; &nbsp; &nbsp;2008-05-05 18:37:58.000000000 +0300 <br />
<span class="re4">+++ simple-tags.php &nbsp; &nbsp; <span class="nu0">2008</span>-<span class="nu0">11</span>-<span class="nu0">22</span> 05:<span class="nu0">27</span>:<span class="nu0">50.000000000</span> +0200 </span><br />
<span class="re6">@@ -<span class="nu0">32</span>,<span class="nu0">7</span> +<span class="nu0">32</span>,<span class="nu0">7</span> @@ </span><br />
&nbsp; <br />
&nbsp;// Check version. <br />
&nbsp;global $wp_version; <br />
<span class="re7">-if <span class="br0">&#40;</span> strpos<span class="br0">&#40;</span>$wp_version, '2.5'<span class="br0">&#41;</span> !== false || strpos<span class="br0">&#40;</span>$wp_version, '<span class="nu0">2.6</span>'<span class="br0">&#41;</span> !== false &nbsp;<span class="br0">&#41;</span> <span class="br0">&#123;</span> </span><br />
<span class="re8">+if <span class="br0">&#40;</span> strpos<span class="br0">&#40;</span>$wp_version, '2.5'<span class="br0">&#41;</span> !== false || strpos<span class="br0">&#40;</span>$wp_version, '2.6'<span class="br0">&#41;</span> !== false || strpos<span class="br0">&#40;</span>$wp_version, '<span class="nu0">2.7</span>'<span class="br0">&#41;</span> !== false <span class="br0">&#41;</span> <span class="br0">&#123;</span> </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; require<span class="br0">&#40;</span>dirname<span class="br0">&#40;</span>__FILE__<span class="br0">&#41;</span>.'/2.5/simple-tags.client.php'<span class="br0">&#41;</span>; <br />
&nbsp;<span class="br0">&#125;</span> elseif <span class="br0">&#40;</span> strpos<span class="br0">&#40;</span>$wp_version, '2.3'<span class="br0">&#41;</span> !== false <span class="br0">&#41;</span> <span class="br0">&#123;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; require<span class="br0">&#40;</span>dirname<span class="br0">&#40;</span>__FILE__<span class="br0">&#41;</span>.'/2.3/simple-tags.client.php'<span class="br0">&#41;</span>;
        </div>
    </div>
</div>

<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/370-wordpress-27-and-simple-tags/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/patches/370-wordpress-27-and-simple-tags/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Учим WordPress правильно кодировать письма в UTF-8</title>
		<link>http://blog.sjinks.pro/wordpress/patches/346-teaching-wordpress-to-correctly-encode-utf8-emails/</link>
		<comments>http://blog.sjinks.pro/wordpress/patches/346-teaching-wordpress-to-correctly-encode-utf8-emails/#comments</comments>
		<pubDate>Sat, 27 Sep 2008 04:57:21 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Патчи]]></category>
		<category><![CDATA[PHP Mailer]]></category>
		<category><![CDATA[utf8]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[патч]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=346</guid>
		<description><![CDATA[Решение проблемы битых заголовков в email Те, кто используют русскоязычную версию WordPress, наверняка не раз сталкивались с проблемой битого заголовка Subject в уведомлениях WordPress. Навреное, проще проиллюстрировать: Очевидно, что это не хорошо Более того, битая кодировка может служить критерием для определения письма спамом. Для того, чтобы убедиться, что такое отображение письма&#160;&#8212;&#160;это не ошибка почтового клиента, [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/346-teaching-wordpress-to-correctly-encode-utf8-emails/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Решение проблемы битых заголовков в email</em></h2>
<p>Те, кто используют русскоязычную версию <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a>, наверняка не раз сталкивались с  проблемой битого заголовка Subject в уведомлениях <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a>. Навреное, проще проиллюстрировать:</p>
<p><a href="http://static.sjinks.info/wp-content/uploads/2008/09/broken-header.png"><img src="http://static.sjinks.info/wp-content/uploads/2008/09/broken-header.png" alt="Битый заголовок Subject" title="broken-header" width="500" height="149" class="size-full wp-image-347" /></a></p>
<p>Очевидно, что это не хорошо <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Более того, битая кодировка  может служить критерием для определения письма спамом.<span id="more-346"></span></p>
<p>Для того, чтобы убедиться, что такое отображение письма&nbsp;&mdash;&nbsp;это не <a href="http://blog.sjinks.pro/tag/bug/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  ошибка">ошибка</a> почтового клиента, я написал маленький тестовый скрипт, который отправляет письма на GMail:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p34626">
        <div class="code php" id="p346code26">
<span class="kw2">&lt;?php</span><br />
&nbsp; &nbsp; <span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st_h">'wp-config.php'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; wp_mail<span class="br0">&#40;</span><span class="st_h">'blablabla@gmail.com'</span><span class="sy0">,</span> <span class="st_h">'[1234567890] New Comment On: Пятерка порадовавших меня запросов'</span><span class="sy0">,</span> <span class="st_h">'Test Message'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="sy1">?&gt;</span>
        </div>
    </div>
</div>

<p>Когда Google отобразил битый Subject, стало понятно, что виноват всё-таки WordPress.</p>
<p>Если посмотреть на исходный текст самого письма, то увидим такие строки:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p34627">
        <div class="code email" id="p346code27">
<span class="sc0"><span class="kw3">Subject</span><span class="sy0">:</span> =?UTF-8?B?WzEyMzQ1Njc4OTBdIE5ldyBDb21tZW50IE9uOiDQn9GP0YLQtdGA0LrQsCDQ?=</span><br />
<span class="sc0"> =?UTF-8?B?v9C+0YDQsNC00L7QstCw0LLRiNC40YUg0LzQtdC90Y8g0LfQsNC/0YDQvtGB?=</span><br />
<span class="sc0"> =?UTF-8?B?0L7Qsg==?=</span>
        </div>
    </div>
</div>

<p>Она заслуживает пристального внимания. В соответствии с RFC&nbsp;2822 WordPress (а точнее&nbsp;&mdash;&nbsp;<a href="http://blog.sjinks.pro/tag/php-mailer/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP Mailer">PHP Mailer</a>) разбил длинный заголовок на три фрагмента, каждый из которых не превышает 78&nbsp;байт. Очевидно, что проблема заключается в том, что скрипт разбивал строку, закодированную BASE64, что привело к тому, что многобайтовые символы UTF-8 были разорваны.</p>
<p>Код это подтверждает:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p34628">
        <div class="code php" id="p346code28">
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$encoded</span> <span class="sy0">=</span> <span class="kw3">base64_encode</span><span class="br0">&#40;</span><span class="re0">$str</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$maxlen</span> <span class="sy0">-=</span> <span class="re0">$maxlen</span> <span class="sy0">%</span> <span class="nu0">4</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$encoded</span> <span class="sy0">=</span> <span class="kw3">trim</span><span class="br0">&#40;</span><span class="kw3">chunk_split</span><span class="br0">&#40;</span><span class="re0">$encoded</span><span class="sy0">,</span> <span class="re0">$maxlen</span><span class="sy0">,</span> <span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>Есть два варианта исправления. Но оба сводятся к редактирования исходного текста WordPress. Иначе никак.</p>
<p>Простой вариант заключается в изменении верхней границы допустимой длины заголовка сообщения. В принципе, это не сильно противоречит стандарту:</p>
<blockquote cite="http://tools.ietf.org/html/rfc2822#section-2.1.1">There are two limits that this standard places on the number of characters in a line. Each line of characters <strong>MUST</strong> be no more than 998 characters, and <strong>SHOULD</strong> be no more than 78 characters, excluding the CRLF.<br />
</blockquote>
<p>То есть, исправив длину, мы проигнорируем SHOULD, но будем принмать во внимание MUST. Лучше, чем ничего.</p>
<p>Итак, <a href="http://blog.sjinks.pro/tag/patch/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  патч">патч</a> в формате unified diff (должен применяться к файлу <code>wp-includes/class-phpmailer.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">php</a></code>):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p34629">
        <div class="code diff" id="p346code29">
--- class-phpmailer.php.orig&nbsp; &nbsp; 2008-06-14 19:36:13.000000000 +0300<br />
<span class="re4">+++ class-phpmailer.php <span class="nu0">2008</span>-09-<span class="nu0">27</span> 02:<span class="nu0">39</span>:<span class="nu0">26.000000000</span> +0300</span><br />
<span class="re6">@@ -<span class="nu0">1160</span>,<span class="nu0">7</span> +<span class="nu0">1160</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;if <span class="br0">&#40;</span>$x == 0<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return <span class="br0">&#40;</span>$str<span class="br0">&#41;</span>;<br />
&nbsp;<br />
<span class="re7">- &nbsp; &nbsp; &nbsp;$maxlen = 75 - 7 - strlen<span class="br0">&#40;</span>$this-&gt;CharSet<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp;$maxlen = 995 - 7 - strlen<span class="br0">&#40;</span>$this-&gt;CharSet<span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;// Try to select the encoding which should produce the shortest output<br />
&nbsp; &nbsp; &nbsp; &nbsp;if <span class="br0">&#40;</span>strlen<span class="br0">&#40;</span>$str<span class="br0">&#41;</span>/3 &lt; $x<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$encoding = 'B';
        </div>
    </div>
</div>

<p>Второе решение (тоже патч) более серьёзное и более надёжное:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p34630">
        <div class="code diff" id="p346code30">
--- class-phpmailer.php.orig&nbsp; &nbsp; 2008-06-14 19:36:13.000000000 +0300<br />
<span class="re4">+++ class-phpmailer.php <span class="nu0">2008</span>-09-<span class="nu0">27</span> 07:<span class="nu0">54</span>:<span class="nu0">25.000000000</span> +0300</span><br />
<span class="re6">@@ -<span class="nu0">655</span>,<span class="nu0">6</span> +<span class="nu0">655</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; &nbsp; */<br />
&nbsp; &nbsp; &nbsp;function WrapText<span class="br0">&#40;</span>$message, $length, $qp_mode = false<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$soft_break = <span class="br0">&#40;</span>$qp_mode<span class="br0">&#41;</span> ? sprintf<span class="br0">&#40;</span>&quot; =%s&quot;, $this-&gt;LE<span class="br0">&#41;</span> : $this-&gt;LE;<br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp;$is_utf8 &nbsp; &nbsp;= <span class="br0">&#40;</span>&quot;utf-8&quot; == strtolower<span class="br0">&#40;</span>$this-&gt;CharSet<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$message = $this-&gt;FixEOL<span class="br0">&#40;</span>$message<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if <span class="br0">&#40;</span>substr<span class="br0">&#40;</span>$message, -1<span class="br0">&#41;</span> == $this-&gt;LE<span class="br0">&#41;</span><br />
<span class="re6">@@ -<span class="nu0">677</span>,<span class="nu0">7</span> +<span class="nu0">678</span>,<span class="nu0">9</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if <span class="br0">&#40;</span>$space_left &gt; 20<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$len = $space_left;<br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if <span class="br0">&#40;</span>substr<span class="br0">&#40;</span>$word, $len - <span class="nu0">1</span>, <span class="nu0">1</span><span class="br0">&#41;</span> == &quot;=&quot;<span class="br0">&#41;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if <span class="br0">&#40;</span>$is_utf8<span class="br0">&#41;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$len = $this-&gt;getUtf8CharBoundary<span class="br0">&#40;</span>$word, $len<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;elseif <span class="br0">&#40;</span>substr<span class="br0">&#40;</span>$word, $len - <span class="nu0">1</span>, <span class="nu0">1</span><span class="br0">&#41;</span> == &quot;=&quot;<span class="br0">&#41;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$len--;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;elseif <span class="br0">&#40;</span>substr<span class="br0">&#40;</span>$word, $len - 2, 1<span class="br0">&#41;</span> == &quot;=&quot;<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$len -= <span class="nu0">2</span>;<br />
<span class="re6">@@ -<span class="nu0">695</span>,<span class="nu0">7</span> +<span class="nu0">698</span>,<span class="nu0">9</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while <span class="br0">&#40;</span>strlen<span class="br0">&#40;</span>$word<span class="br0">&#41;</span> &gt; 0<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$len = $length;<br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if <span class="br0">&#40;</span>substr<span class="br0">&#40;</span>$word, $len - <span class="nu0">1</span>, <span class="nu0">1</span><span class="br0">&#41;</span> == &quot;=&quot;<span class="br0">&#41;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if <span class="br0">&#40;</span>$is_utf8<span class="br0">&#41;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$len = $this-&gt;getUtf8CharBoundary<span class="br0">&#40;</span>$word, $len<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;elseif <span class="br0">&#40;</span>substr<span class="br0">&#40;</span>$word, $len - <span class="nu0">1</span>, <span class="nu0">1</span><span class="br0">&#41;</span> == &quot;=&quot;<span class="br0">&#41;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$len--;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;elseif <span class="br0">&#40;</span>substr<span class="br0">&#40;</span>$word, $len - 2, 1<span class="br0">&#41;</span> == &quot;=&quot;<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$len -= <span class="nu0">2</span>;<br />
<span class="re6">@@ -<span class="nu0">1164</span>,<span class="nu0">9</span> +<span class="nu0">1169</span>,<span class="nu0">14</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;// Try to select the encoding which should produce the shortest output<br />
&nbsp; &nbsp; &nbsp; &nbsp;if <span class="br0">&#40;</span>strlen<span class="br0">&#40;</span>$str<span class="br0">&#41;</span>/3 &lt; $x<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$encoding = 'B';<br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp;if <span class="br0">&#40;</span>true == function_exists<span class="br0">&#40;</span>'mb_strlen'<span class="br0">&#41;</span> &amp;&amp; strlen<span class="br0">&#40;</span>$str<span class="br0">&#41;</span> &gt; mb_strlen<span class="br0">&#40;</span>$str, $this-&gt;CharSet<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$encoded = $this-&gt;b64Multibyte<span class="br0">&#40;</span>$str<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp;else <span class="br0">&#123;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$encoded = base64_encode<span class="br0">&#40;</span>$str<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$maxlen -= $maxlen % <span class="nu0">4</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$encoded = trim<span class="br0">&#40;</span>chunk_split<span class="br0">&#40;</span>$encoded, $maxlen, &quot;\n&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span> else <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$encoding = 'Q';<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$encoded = $this-&gt;EncodeQ<span class="br0">&#40;</span>$str, $position<span class="br0">&#41;</span>;<br />
<span class="re6">@@ -<span class="nu0">1492</span>,<span class="nu0">6</span> +<span class="nu0">1502</span>,<span class="nu0">66</span> @@</span><br />
&nbsp; &nbsp; &nbsp;function AddCustomHeader<span class="br0">&#40;</span>$custom_header<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;CustomHeader<span class="br0">&#91;</span><span class="br0">&#93;</span> = explode<span class="br0">&#40;</span>&quot;:&quot;, $custom_header, 2<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span><br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp;function getUtf8CharBoundary<span class="br0">&#40;</span>$s, $max_len<span class="br0">&#41;</span></span><br />
<span class="re8">+ &nbsp; &nbsp;<span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp;$lb = <span class="nu0">3</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp;while <span class="br0">&#40;</span>true<span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$x = substr<span class="br0">&#40;</span>$s, $max_len - $lb, $lb<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$pos = strpos<span class="br0">&#40;</span>$x, &quot;=&quot;<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if <span class="br0">&#40;</span>false !== $pos<span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$hex = substr<span class="br0">&#40;</span>$s, $max_len - $lb + $pos + 1, 2<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$dec = hexdec<span class="br0">&#40;</span>$hex<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if <span class="br0">&#40;</span>$dec &lt; <span class="nu0">128</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if <span class="br0">&#40;</span>$pos &gt; <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$max_len = $max_len - $lb + $pos;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></span><br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></span><br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if <span class="br0">&#40;</span>$dec &gt;= <span class="nu0">192</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$max_len = $max_len - $lb + $pos;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></span><br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$lb += <span class="nu0">3</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></span><br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp;return $max_len;</span><br />
<span class="re8">+ &nbsp; &nbsp;<span class="br0">&#125;</span></span><br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp;function b64MultiByte<span class="br0">&#40;</span>$s<span class="br0">&#41;</span></span><br />
<span class="re8">+ &nbsp; &nbsp;<span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp;$start &nbsp; = &quot;=?<span class="br0">&#123;</span>$this-&gt;CharSet<span class="br0">&#125;</span>?B?&quot;;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp;$end &nbsp; &nbsp; = &quot;?=&quot;;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp;$encoded = &quot;&quot;;</span><br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp;$mb_length = mb_strlen<span class="br0">&#40;</span>$s, $this-&gt;CharSet<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp;$str_len &nbsp; = strlen<span class="br0">&#40;</span>$s<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp;$length &nbsp; &nbsp;= 75 - strlen<span class="br0">&#40;</span>$start<span class="br0">&#41;</span> - <span class="nu0">2</span>; //<span class="nu0">2</span> - strlen<span class="br0">&#40;</span>$end<span class="br0">&#41;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp;$step &nbsp; &nbsp; &nbsp;= floor<span class="br0">&#40;</span>0.75 * $length * $mb_length/$str_len<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp;$average &nbsp; = $step;</span><br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp;for <span class="br0">&#40;</span>$i=<span class="nu0">0</span>; $i&lt;$mb_length; $i+=$step<span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$lb = <span class="nu0">0</span>;</span><br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;do <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$step = $average - $lb;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$tmp &nbsp;= base64_encode<span class="br0">&#40;</span>mb_substr<span class="br0">&#40;</span>$s, $i, $step, $this-&gt;CharSet<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;++$lb;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while <span class="br0">&#40;</span>strlen<span class="br0">&#40;</span>$tmp<span class="br0">&#41;</span> &gt; $length<span class="br0">&#41;</span>;</span><br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;$encoded .= $tmp . $this-&gt;LE;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></span><br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp;return substr<span class="br0">&#40;</span>$encoded, 0, -strlen<span class="br0">&#40;</span>$this-&gt;LE<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp;<span class="br0">&#125;</span></span><br />
&nbsp;<span class="br0">&#125;</span><br />
&nbsp;<br />
&nbsp;?&gt;
        </div>
    </div>
</div>

<p>Очень надеюсь, что решение кому-нибудь поможет <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/patches/346-teaching-wordpress-to-correctly-encode-utf8-emails/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/patches/346-teaching-wordpress-to-correctly-encode-utf8-emails/feed/</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
		<item>
		<title>Конвертирование базы данных MySQL из одного charset в другой</title>
		<link>http://blog.sjinks.pro/mysql/3-convert-mysql-database-from-one-charset-to-another/</link>
		<comments>http://blog.sjinks.pro/mysql/3-convert-mysql-database-from-one-charset-to-another/#comments</comments>
		<pubDate>Sun, 09 Mar 2008 21:30:02 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[convert]]></category>
		<category><![CDATA[utf8]]></category>
		<category><![CDATA[база данных]]></category>
		<category><![CDATA[преобразование]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/mysql/3-%d0%ba%d0%be%d0%bd%d0%b2%d0%b5%d1%80%d1%82%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5-%d0%b1%d0%b0%d0%b7%d1%8b-%d0%b4%d0%b0%d0%bd%d0%bd%d1%8b%d1%85-mysql-%d0%b8%d0%b7-%d0%be%d0%b4%d0%bd%d0%be/</guid>
		<description><![CDATA[Быстрый способ преобразования charset базы данных MySQL Недавно мне пришлось столкнуться с задачей перевода базы данных из одного charset в другой. Исходная база была в iso-8859-1, предстояло перевести её в utf-8. Задача усложнялась тем, что в исходной базе присутствовали символы из других языков (русский, испанский и, возможно, китайский). Погуляв по Интернету и поискав в Google, [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/mysql/3-convert-mysql-database-from-one-charset-to-another/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Быстрый способ преобразования charset базы данных <a href="http://blog.sjinks.pro/tag/mysql/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  MySQL">MySQL</a></em></h2>
<p>Недавно мне пришлось столкнуться с задачей перевода базы данных из одного charset в другой. Исходная база была в iso-8859-1, предстояло перевести её в utf-8. Задача усложнялась тем, что в исходной базе присутствовали символы из других языков (русский, испанский и, возможно, китайский).<span id="more-3"></span></p>
<p>Погуляв по Интернету и поискав в Google, я нашёл несколько решений.</p>
<ol>
<li>Способ, который мне очень понравился&nbsp;&mdash;&nbsp;<a href="http://gentoo-wiki.com/TIP_Convert_latin1_to_UTF-8_in_MySQL" rel="nofollow">TIP: Convert latin1 to UTF-8 in MySQL</a><br />
Вкратце (я немного изменил команды для повышения эффективности работы скрипта):
          
<div class="codebox">
    <div class="the_code" style="" id="p333">
        <div class="code bash" id="p3code33">
mysqldump <span class="re5">-uuser</span> <span class="re5">-ppassword</span> <span class="re5">--default-character-set</span>=latin1 <span class="re5">-n</span> <span class="re5">-K</span> <span class="re5">--skip-set-charset</span> <span class="re5">--skip-create-options</span> <span class="re5">--skip-extended-insert</span> <span class="re5">--compatible</span>=mysql40 --max_allowed_packet=64K dbname <span class="sy0">&gt;</span> latin_dump.sql<br />
iconv <span class="re5">-f</span> ISO-8859-1 <span class="re5">-t</span> UTF-8 latin_dump.sql <span class="sy0">&gt;</span> utf8_dump.sql<br />
mysql --max_allowed_packet=1M <span class="re5">-uuser</span> <span class="re5">-ppassword</span> <span class="re5">--default-character-set</span>=utf8 database_utf8 <span class="sy0">&lt;</span> utf8_dump.sql<br />
<span class="kw2">rm</span> <span class="re5">-f</span> <span class="sy0">*</span>.sql
        </div>
    </div>
</div>

<p>Идея состоит в том, что мы просто создаём дамп исходной базы, при этом указывая mysqldump, что никаких деклараций <code>CHARSET</code> и иже с ними указывать не надо, затем скармливаем полученный дамп iconv, который преобразует весь latin1 в <a href="http://blog.sjinks.pro/tag/utf8/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  utf8">utf8</a>, а затем преобразованный файл отдаём mysql  (при этом указываем, что <code>charset</code> по умолчанию у нас utf8).<br />
Из неприятного: не сработало <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Как оказалось, из-за того, что cPanel создал базу (которая database_utf8) с <code>DEFAULT CHARSET latin1</code>. К счастью, лечится просто:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p334">
        <div class="code mysql" id="p3code34">
<span class="kw1">ALTER</span> <span class="kw2">DATABASE</span> <span class="st0">`database<span class="es1">_</span>utf8`</span> CHARACTER <span class="kw1">SET</span> <span class="st0">'utf8'</span><span class="sy2">;</span><br />
<span class="kw1">ALTER</span> <span class="kw2">DATABASE</span> <span class="st0">`database<span class="es1">_</span>utf8`</span> <span class="kw10">COLLATE</span> <span class="st0">'utf8<span class="es1">_</span>general<span class="es1">_</span>ci'</span><span class="sy2">;</span>
        </div>
    </div>
</div>

</li>
<li>Экзотика (ссылку, к сожалению, потерял): идея состоит в том, что каждый столбец (CHAR, VARCHAR, TEXT etc) преобразуется сначала в BLOB (при этом меняется только тип столбца и ничего более), а затем BLOB преобразуется в исходный тип, но уже с новым charset. Я как представлю себе, сколько там менять&hellip;</li>
<li>Супер экзотика: <a href="http://www.oreillynet.com/onlamp/blog/2006/01/turning_mysql_data_in_latin1_t.html" rel="nofollow">Turning MySQL data in latin1 to utf8 utf-8</a>. Без комментариев <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Видимо, человеку очень надо было преобразовать базу <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
</ol>
<p>И на закуску самый простой метод:</p>
<pre lang="mysql">ALTER TABLE `table_name` <a href="http://blog.sjinks.pro/tag/convert/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  convert">CONVERT</a> TO CHARACTER SET 'utf8';</pre>
<p>Ибо как сказано в <a href="http://dev.mysql.com/doc/refman/5.0/en/alter-table.html" title="ALTER TABLE Syntax" trl="nofollow">официальной документации</a>:</p>
<blockquote cite="http://dev.mysql.com/doc/refman/5.0/en/alter-table.html">If you want to change the table default character set and all character columns (CHAR, VARCHAR, TEXT) to a new character set, use a statement like this:
<pre lang="mysql">ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;</pre>
<p>For a column that has a data type of VARCHAR or one of the TEXT types, CONVERT TO CHARACTER SET will change the data type as necessary to ensure that the new column is long enough to store as many characters as the original column. For example, a TEXT column has two length bytes, which store the byte-length of values in the column, up to a maximum of 65,535. For a latin1 TEXT column, each character requires a single byte, so the column can store up to 65,535 characters. If the column is converted to utf8, each character might require up to 3 bytes, for a maximum possible length of 3 × 65,535 = 196,605 bytes. That length will not fit in a TEXT column's length bytes, so MySQL will convert the data type to MEDIUMTEXT, which is the smallest string type for which the length bytes can record a value of 196,605. Similarly, a VARCHAR column might be converted to MEDIUMTEXT.</p></blockquote>
<p><strong>А мораль такова:</strong> если ничего не получается, прочтите, наконец, документацию! <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/mysql/3-convert-mysql-database-from-one-charset-to-another/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/mysql/3-convert-mysql-database-from-one-charset-to-another/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

