<sect1 id="zend.search.lucene.charset">
    <title>Кодировки<!--Character set.--></title>

    <sect2 id="zend.search.lucene.charset.description">
        <title>Поддержка UTF-8 и однобайтных наборов символов<!--UTF-8 and single-byte character sets support.--></title>

        <para>
            Zend_Search_Lucene в своей работе использует кодировку UTF-8.
            Файлы индекса хранят данные unicode в кодировке Modified UTF-8 от
            Java. Ядро Zend_Search_Lucene полностью поддерживает его за одним
            исключением.
<!--
            Zend_Search_Lucene works with UTF-8 charset internally. Index files store
            unicode data in Java's "modified UTF-8 encoding". Zend_Search_Lucene core
            completely supports it with one exception.
-->
            <footnote>
               <para>
                   Zend_Search_Lucene поддерживает только символы
                   Basic Multilingual Plane (от 0x0000 до 0xFFFF) и не
                   поддерживает дополнительные символы (символы, чьи коды больше
                   0xFFFF).
<!--
                   Zend_Search_Lucene supports only Basic Multilingual Plane
                   (BMP) characters (from 0x0000 to 0xFFFF) and doesn't support
                   "supplementary characters" (characters whose code points are
                   greater than 0xFFFF)
-->
               </para>
               <para>
                   Java 2 представляет эти символыв виде пары значений
                   символьного типа (16 бит), перое из диапазона 0xD800-0xDBFF,
                   второе из диапазона 0xDC00-0xDFFF. Тогда они кодируются как
                   обычные символы UTF-8 в шести байтах. Стандартное
                   представление UTF-8 использует четыре байта для
                   дополнительных символов.
<!--
                   Java 2 represents these characters as a pair of char (16-bit)
                   values, the first from the high-surrogates range (0xD800-0xDBFF),
                   the second from the low-surrogates range (0xDC00-0xDFFF). Then
                   they are encoded as usual UTF-8 characters in six bytes.
                   Standard UTF-8 representation uses four bytes for supplementary
                   characters.
-->
               </para>
            </footnote>

        </para>

        <para>
            Действующая кодировка для входных данных может быть указана через
            API Zend_Search_Lucene. Данные будут автоматически преобразованы в
            кодировку UTF-8.
<!--
            Actual input data encoding may be specified through Zend_Search_Lucene API. Data will
            be automatically converted into UTF-8 encoding.
-->
        </para>
    </sect2>

    <sect2 id="zend.search.lucene.charset.default_analyzer">
        <title>Используемый по умолчанию анализатор текста<!--Default text analyzer--></title>

        <para>
            Несмотря на это, используемый по умолчанию анализатор текста
            (который также применяется в парсере запросов) использует
            <code>ctype_alpha()</code> для разбиения текста и поисковых
            запросов на лексемы.
<!--
            However, default text analyzer (which is also used within query parser) uses
            ctype_alpha() for tokenizing text and queries.
-->
        </para>

        <para>
            <code>ctype_alpha()</code> не является совместимым с UTF-8, поэтому
            анализатор конвертирует текст в кодировку 'ASCII//TRANSLIT' до
            индексации. То же самое выполняется при парсинге запросов.
<!--
            ctype_alpha() is not UTF-8 compatible, so analyzer converts text to 'ASCII//TRANSLIT' encoding before
            indexing. The same processing is performed during query parsing, so it's done
            transparently.
-->
            <footnote>
               <para>
                   Преобразование в 'ASCII//TRANSLIT' может зависеть от текущей
                   локали и операционной системы.
<!--
                   Conversion to 'ASCII//TRANSLIT' may depend on current locale and OS.
-->
               </para>
            </footnote>
        </para>
    </sect2>

    <sect2 id="zend.search.lucene.charset.utf_analyzer">
        <title>Совместимый с UTF-8 анализатор текста<!--UTF-8 compatible text analyzer.--></title>

        <para>
            Zend_Search_Lucene также содержит совместимый с UTF-8 анализатор
            текста с ограниченным функционалом.
<!--
            Zend_Search_Lucene also contains limited functionaliy utf-8 analyzer. It can be turned on with the following code:
-->

            <programlisting language="php"><![CDATA[<?php
Zend_Search_Lucene_Analysis_Analyzer::setDefault(
    new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());]]></programlisting>
        </para>

        <para>
            Он разбивает на лексемы данные для индексации в режиме UTF-8, не
            испытывая проблем с любыми входящими в UTF-8 символами.
<!--
            It tokenizes data for indexing in UTF-8 mode and has no problems with any UTF-8 compatible character.
-->
        </para>

        <para>
            Данный анализатор имеет два ограничения:
<!--
            It has two limitations:
-->
            <itemizedlist>
                <listitem>
                    <para>
                        обрабатывает все не входящие в кодировку ASCII как буквы;
<!--
                        treats all non-ascii characters as letters (it's not always true);
-->
                    </para>
                </listitem>
                <listitem>
                    <para>
                        является чувствительным к регистру;
<!--
                        is case-sensitive;
-->
                    </para>
                </listitem>
            </itemizedlist>
        </para>

        <para>
            Из-за этих ограничений он не используется по умолчанию, но может
            быть полезен некоторым.
<!--
            Because of these limitations it's not set as default, but may be helpful for someone.
-->
        </para>

        <para>
            Нечувствительность к регистру может быть сэмулирована с помощью
            <code>strtolower()</code>.
<!--
            Case insensitivity my be emulated with <code>strtolower()</code> conversion:
-->
            <programlisting language="php"><![CDATA[<?php
setlocale(LC_CTYPE, 'de_DE.iso-8859-1');

...

Zend_Search_Lucene_Analysis_Analyzer::setDefault(
    new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());

...

$doc = new Zend_Search_Lucene_Document();

$doc->addField(Zend_Search_Lucene_Field::UnStored('contents', strtolower($contents)));

// Поле заголовка для поиска
// (индексируется, но не сохраняется в индексе)
$doc->addField(Zend_Search_Lucene_Field::UnStored('title', strtolower($title)));

// Поле заголовка для возвращения в результатах поиска
// (не индексируется, но сохраняется)
$doc->addField(Zend_Search_Lucene_Field::UnIndexed('_title', $title));]]></programlisting>
        </para>

        <para>
            То же самое преобразование должно выполняться и для запросов:
<!--
            The same conversion has to be performed with query string:
-->
            <programlisting language="php"><![CDATA[<?php
setlocale(LC_CTYPE, 'de_DE.iso-8859-1');

...

Zend_Search_Lucene_Analysis_Analyzer::setDefault(
    new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8());

...

$hits = $index->find(strtolower($query));]]></programlisting>
        </para>
    </sect2>
</sect1>

<!--
vim:se ts=4 sw=4 et:
-->
